Для целей остекления почему входные элементы в Swing, по-видимому, не считаются частью JPanel? - PullRequest
2 голосов
/ 14 марта 2012

Под элементами ввода я понимаю такие вещи, как JSpinners и JComboxBoxes. Моя стеклянная панель прошла JPanel, содержащую JSpinners, JComboBoxes и по большей части JLabels. К стеклянному стеклу прикреплен MouseListener. Удивительно то, что mouseEntered вызывается при наведении курсора мыши на элементы ввода и наведении на другие части или пустое пространство JPanel! Это нормальное поведение? Как я могу заставить входные элементы считаться частью JPanel для целей Glasspane?

Вот скриншот моего пользовательского интерфейса с элементами ввода и jLabels. Sample UI

Вот пример кода:

import javax.swing.*;

public class DialogTest {
    public DialogTest() {
        JPanel dialogPanel = new JPanel();
        SpinnerModel edgeModel = new SpinnerNumberModel(1, 1, 9, 1);
        JSpinner edgeSpn = new JSpinner(edgeModel);
        dialogPanel.add(edgeSpn);

        JDialog initialDialog = new JDialog(new JFrame(), "Test", true);
        initialDialog.setContentPane(dialogPanel);
        initialDialog.pack();
        glass = new GlassComponent(dialogPanel);
        initialDialog.setGlassPane(glass);
        glass.setOpaque(false);
        glass.setVisible(true);
    initialDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    initialDialog.setVisible(true);
    }
}

public class GlassComponent implements MouseListener {
   JPanel c;
   public GlassComponent(JPanel c) {
       this.c = c;
       this.c.addMouseListener(this);
   }

   ...
   public mouseEntered(MouseEvent e) {
       System.out.println("Entered JPanel");
   }    
}

В порядке объяснения, моя цель - в конечном итоге использовать GlassPane для блокировки ввода для тех элементов, которые отмечены знаком запрета. Однако, учитывая, что mouseListener, назначенный для dialogPanel, по-видимому, генерирует новые события после выхода из элементов ввода, у меня могут быть некоторые трудности в достижении этого.

Ответы [ 3 ]

4 голосов
/ 14 марта 2012
  • вы можете использовать GlassPane для наложения требуется Контейнер или JComponent от @camickr, или мои вопросы, основанные на его коде здесь или здесь

  • другим предложением может быть использование JLayer (требуется Java7 для Java6, есть JXLayer)

4 голосов
/ 15 марта 2012

Вы можете перенаправить события мыши на базовые компоненты, как показано в Стеклянная панель метод демонстрации, redispatchMouseEvent().

4 голосов
/ 14 марта 2012

Вы, кажется, используете стеклянную панель так, как мне кажется, ее не следует использовать.

Насколько я знаю, стеклянная панель, как правило, вообще не должна содержать компоненты, а должна закрыватьокно верхнего уровня, а затем может выступать в качестве привратника для компонентов, которые находятся под ним, все они содержатся в contentPane окна верхнего уровня.

...