由于我覆盖了函数,

时间:2019-05-22 06:53:20

标签: java swing events windowlistener

我正在编写一个GUI。我要在关闭后打印一些东西。但是WindowListener不起作用。我写了一个窗口,然后我想有一个boolean来标记窗口已关闭。因此,之后我可以在if子句中使用该boolean来编写下一个应在Windows关闭后执行的语句。

public class MyFrame extends JFrame implements  WindowListener {

    private boolean close=false;

    MyFrame() {
        this.close=false;
        setSize(300,250);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        addWindowListener(this);
           // after help, I've added addWindowListener although still don't 
            //work

    }

    public void windowOpened()/windowIconified()/windowDeiconified()...
    public void windowClosing(WindowEvent e) {close=true;}
    public void windowClosed(WindowEvent e) {close=true;}
}

public class MyFrameControl {
    MyFrame setframe() {
        MyFrame fr = new MyFrame();
        fr.setVisible(true);
        return fr;
    }
}

public class test {
    public static void main(String args[]) {
        MyFrameControl frameCtrl= new MyFrameControl();
        MyFrame tmpFrame = frameCtrl.setframe(); 

        if(tmpFrame.close==true) {
            System.out.println("close is true");
        }
    }
}

当我关闭JFrame / MyFrame时,执行打印行时是否应该将布尔值close设为true? 添加addWindowListener之后在JFrame下仍然无法工作,除了切换到JDialogue之外,在JFrame下还有什么解决方法吗?

1 个答案:

答案 0 :(得分:0)

不。

您的代码不等待JFrame重新关闭,就像已经提到的@Abra一样,您永远不要将WindowListener添加到JFrame 中。

您的k.setVisible(true)立即返回,并且您的框架仍然可见。

因此,在检查条件时不会调用windowClosing() / windowClosed()

也许您可以将JFrame转换为JDialog,可以将其设置为modalsetModal() / setModalityType())。关闭对话框后,将返回模式对话框的setVisible()

要使用JFrame进行模拟,您必须以某种方式等待关闭发生。您可以将System.out...放入线程(Runnable)中,该线程一直等待到close==true

根据定义,JFrame不是模态(How to make a JFrame Modal in Swing java