我有一个有两层的 JLayeredPane。顶层是完全透明的,作为一个玻璃窗格,它捕获鼠标事件,然后将它们分派到它下面的窗格中。由于未知原因,底层无法正确绘制。我是否必须向它发送绘画事件或其他什么?
顺便说一句,我会使用 Frame 的玻璃窗格,但我无法做到。我被困在使用建立在 Swing 之上的 GUI 框架提供的 JPanel 上。我尝试使用 SwingUtilities 来获取父框架,但它总是返回 null。
我有一个有两层的 JLayeredPane。顶层是完全透明的,作为一个玻璃窗格,它捕获鼠标事件,然后将它们分派到它下面的窗格中。由于未知原因,底层无法正确绘制。我是否必须向它发送绘画事件或其他什么?
顺便说一句,我会使用 Frame 的玻璃窗格,但我无法做到。我被困在使用建立在 Swing 之上的 GUI 框架提供的 JPanel 上。我尝试使用 SwingUtilities 来获取父框架,但它总是返回 null。
如果您想使用玻璃窗格并在 Swing 中捕获事件,请使用 JLayer (Java 7)。如果您不使用 Java 7,您可以使用 JXLayer ( http://java.net/projects/jxlayer/ )。这是此行为的新 Swing 默认组件。看
我同意 Guillaune 的观点,这是一个非常模糊的问题。因此,您可能有充分的理由按照您的方式进行操作。但是,如果它有帮助,您可能可以完全处理透明层,只需将鼠标侦听器直接附加到 JLayeredPane:
JPanel jP = new JPanel();
JLayeredPane jLP = new JLayeredPane();
MouseAdapter mouse = new MouseAdapter();
jLP.addMouseListener(mouse);
然后是 MouseAdapter 类:
public class MouseAdapter{
//Make sure you override the methods
}
另一种方式,也是我经常使用的方式,是简单地扩展 JLayeredPane 并实现 MouseListener:
public class MyLayers extends JLayeredPane implements MouseListener
{
public MyLayers(){
addMouseListener(this);
}
//again make sure you override the methods
}
这会在 NetBeans 中引发“在构造函数中泄漏 this”,但它是可以忽略的。