2

我所说的输入元素是指 JSpinners 和 JComboxBoxes 之类的东西。我的 glasspane 传递了一个 JPanel,其中包含 JSpinners、JComboBoxes 和大部分 JLabels。玻璃窗格附加了一个 MouseListener。令人惊讶的是,当鼠标光标离开输入元素并悬停在 JPanel 的其他部分或空白空间上时,会调用 mouseEntered!这是正常行为吗?为了 Glasspane 的目的,如何让输入元素被视为 JPanel 的一部分?

这是我的 UI 的屏幕截图,其中包含输入元素和 jLabels。 示例用户界面

这是一段代码示例:

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 在离开输入元素时似乎会生成新事件,我可能会遇到一些困难。

4

3 回答 3

4

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

据我所知,玻璃板通常根本不应该容纳组件,而是覆盖顶层窗口,然后可以充当其下方组件的看门人,所有组件都由顶层窗口固定内容窗格。

于 2012-03-14T18:05:19.407 回答
4
  • 您可以使用@camickrGlassPane覆盖所需的Container 或JComponent,或者我的问题基于他的代码herehere

  • 另一个建议是使用JLayer(Java6 需要 Java7 是否有 JXLayer)

于 2012-03-14T19:37:27.100 回答
4

您可以将鼠标事件转发到底层组件,如Glass Pane演示的方法所示,redispatchMouseEvent().

于 2012-03-14T20:29:45.773 回答