e.getWindow()。dispose()不起作用?

时间:2010-07-02 09:02:12

标签: swing jframe

我有一个主程序调用{​​{1}}来获取用户信息,如果用户按提交,我将信息存储在POJO中并将其存入主程序。

如果User点击Exit,我想处理JFrame,并且想要在main方法中执行一个日志语句后退出主程序。

如果我使用 -

JFrame

所有线程立即退出,我无法在main方法中执行日志记录。

如果我使用 -

 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
and
this.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                e.getWindow().dispose();
            }
        });

我的主要方法执行那些日志记录,但它永远不会退出,在执行所有语句后保持静默。

如果我使用它 -

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 this.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                e.getWindow().dispose();
            }
        });

一切正常。但这是正确的做法吗?

2 个答案:

答案 0 :(得分:1)

理论上,如果您dispose所有顶级窗口,JVM应该干净地终止。

但是,有一些细节需要确保,详见this page

  

因此,一个独立的AWT   希望退出的申请   干净利落地不调用System.exit   必须:

     
      
  • 确保所有AWT或Swing组件都不可显示   申请结束。这可以   通过在所有上调用Window.dispose来完成   顶级Windows。看到   Frame.getFrames。
  •   
  • 确保没有注册AWT事件侦听器的方法   任何AWT或Swing的应用程序   组件可以遇到无限   无限循环或挂起。对于   例如,一个AWT监听器方法   一些AWT事件触发可以发布一个   相同类型的新AWT事件   EventQueue中。争论是这样的   AWT事件监听器的方法是   通常在辅助线程上执行。
  •   

如果你无法找到让程序保持活力的东西,可以采用另一种方式:

- 使用您描述的第一种方法,使用EXIT_ON_CLOSE
- 将ShutdownHook添加到运行时,以执行上次记录语句:

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        //logging statements
    });

答案 1 :(得分:0)

Dispose方法仅释放系统资源。 要实际关闭窗口,您必须致电setVisible(false)