对于玻璃板目的,为什么Swing中的输入元素似乎不被视为JPanel的一部分?

时间:2012-03-14 18:00:23

标签: java swing jpanel glasspane

输入元素我的意思是JSpinners和JComboxBoxes。我的glasspane传递了一个JPanel,其中包含JSpinners,JComboBoxes以及大部分JLabels。 Glasspane附有MouseListener。令人惊讶的是,mouseEntered在鼠标光标上调用,离开输入元素并悬停在JPanel的其他部分或空白区域!这是正常的行为吗?如何将输入元素视为用于Glasspane目的的JPanel的一部分?

以下是我的UI及其输入元素和jLabel的屏幕截图。 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阻止那些标有禁止标志的元素的输入。但是,鉴于分配给dialogPanel的mouseListener在离开输入元素时似乎正在生成新事件,我可能在实现这一点时遇到一些困难。

3 个答案:

答案 0 :(得分:4)

您似乎以我认为不应使用的方式使用玻璃板。

据我所知,玻璃板通常不应该是保持组件,而是覆盖在顶层窗口上,然后可以充当其下方组件的门卫,所有组件都由顶级窗口的contentPane。

答案 1 :(得分:4)

  • 您可以{@ 1}}使用@camickr所需的重叠式Container or JComponent,或者我的问题基于他的代码herehere

    < / LI>
  • 另一个建议可能是JLayer(Java6所需的Java7是JXLayer)

答案 2 :(得分:4)

您可以将鼠标事件转发到基础组件,如The Glass Pane演示方法redispatchMouseEvent()中所示。