我制作了一个自己的 Window-Model,它扩展了 JFrame 和 JDialog,没有 Window-Decoration。如果我创建一个新窗口,它是相应模型的实例。为了处理这些窗口的大小调整,我在这些模型中添加了性能良好的玻璃窗格。GlassPane 像这样添加到框架/对话框中
//here, I create a new GlassPane and give it the instance of the JFrame/JDialog, so the
AWT-Listener in the GlassPane can resize this instance.
glassPane = new GlassPane(this, res, valWidth, valHeight, RESIZEBORDER,
BORDERPIXEL, isResizable, keepRatio);
//then I set this GlassPane to the JFame/JDialog
this.setGlassPane(glassPane);
//this is from the example. I'm not absolutly sure, what it does.
if (this.glassPane instanceof AWTEventListener) {
AWTEventListener al = (AWTEventListener) glassPane;
Toolkit.getDefaultToolkit().addAWTEventListener(
al,
AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.MOUSE_EVENT_MASK);
}
glassPane.setVisible(true);
glassPane.repaint();
在 GlassPane 中,我修改了示例中的事件,如下所示:
public void eventDispatched(AWTEvent event) {
if (event instanceof MouseEvent) {
//I convert the MouseEvent like in the example
MouseEvent e = (MouseEvent)event;
if (target instanceof JFrame) {
e = SwingUtilities.convertMouseEvent(
((MouseEvent) event).getComponent(),
(MouseEvent) event, ((JFrame) target).getGlassPane());
} else if (target instanceof JDialog) {
e = SwingUtilities.convertMouseEvent(
((MouseEvent) event).getComponent(),
(MouseEvent) event, this);
}
if (!SwingUtilities.isDescendingFrom(e.getComponent(), target)) {
return;
}
//I check the events like this
if (e.getID() == MouseEvent.MOUSE_EXITED) {
System.out.println("exit");
}
现在我的问题:
如果我打开一个 JFrame 并且这个框架打开一个 JDialog,那么所有的调整大小都会起作用。如果我将光标移动到 JDialog 上,也会触发 MOUSE_ENTERS-Event。但是只有当我将光标移出 JDialog 并且还移出 JFrame 时,才会触发 MOUSE_EXITED-Event。另一个问题是,Mouse_Entered-Event 被触发了两次:第一个被 JDialog 的 GlassPane 触发,第二个被 JFrame 的 GlassPane 触发。我也尝试将 MouseListener 直接添加到 JFrame/JDialog,但这具有相同的效果。也许这很重要:我已将 JFrame 设置为 JDialog 的所有者。
我不知道为什么会这样。我希望有人可以帮助我。
提前致谢。