0

我制作了一个自己的 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 的所有者。

我不知道为什么会这样。我希望有人可以帮助我。

提前致谢。

4

1 回答 1

1

要处理这些窗口的大小调整...

有关可能更简单的解决方案,请参阅调整组件大小。

于 2013-04-30T01:58:19.900 回答