Java 出于glasspane的目的,为什么Swing中的输入元素似乎不被视为JPanel的一部分?
我所说的输入元素是指像JSpinner和JComboxBox这样的东西。我的glasspane被传递给一个JPanel,其中包含JSpinner、JComboxes和大部分JLabel。玻璃窗上有一个鼠标听筒。令人惊讶的是,鼠标光标离开输入元素并悬停在JPanel的其他部分或空白处时,Mouseenterned被调用!这是正常的行为吗?如何使输入元素被视为用于Glasspane的JPanel的一部分 下面是我的UI的屏幕截图,其中包含输入元素和jlabel。 下面是一段示例代码:Java 出于glasspane的目的,为什么Swing中的输入元素似乎不被视为JPanel的一部分?,java,swing,jpanel,glasspane,Java,Swing,Jpanel,Glasspane,我所说的输入元素是指像JSpinner和JComboxBox这样的东西。我的glasspane被传递给一个JPanel,其中包含JSpinner、JComboxes和大部分JLabel。玻璃窗上有一个鼠标听筒。令人惊讶的是,鼠标光标离开输入元素并悬停在JPanel的其他部分或空白处时,Mouseenterned被调用!这是正常的行为吗?如何使输入元素被视为用于Glasspane的JPanel的一部分 下面是我的UI的屏幕截图,其中包含输入元素和jlabel。 下面是一段示例代码: import
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的MouseStener在离开输入元素时似乎正在生成新事件,我可能很难实现这一点 您似乎在使用glasspane,而我觉得它不应该被使用 据我所知,玻璃窗格通常不应该容纳任何组件,而是覆盖在顶层窗口上,然后可以充当其下方组件的门卫,所有组件都由顶层窗口的内容窗格容纳。
- 您可以使用
获取@camickr所需的覆盖,或者根据他的代码或GlassPane
- 另一个建议是使用(Java6需要Java7,JXLayer是否存在)
RedispatchMouseeEvent()
感谢您的回答,这似乎有助于我实现目标。我在演示中看到了RedispatchMouseeEvent(),但直到现在还没有意识到它的重要性和实用性+凌晨1点,我正确推断这是一种新的方式来表示控制不适用?setEnabled()
或动态布局也可以吗?谢谢您的评论,您的推断是正确的。不幸的是,setEnabled()会使相关的JComponents变灰,因此几乎无法读取。上面的截图并没有达到不可理解的程度。我将不得不谷歌动态布局。嗨气垫船,谢谢你的评论,我重视和尊重它。我想我需要进一步考虑如何实现玻璃窗格。我最初担心的是,我无法用一块空白的玻璃窗格确定鼠标在哪个组件上,但我想GetDeepTestComponentAT()将解决这个问题+你好,mKorbel,感谢您的回答和建议。我仍在消化您链接的代码。:)+1.