关闭JFrame时,程序中的所有内容都会终止吗?

时间:2017-08-19 16:22:55

标签: java multithreading swing jframe

我有一个扩展JFrame的GUI,它由另一个对象的构造函数创建:

setupTests.js

当点击某些按钮时,GUI的eventListener也会创建新线程:

public Engine(int width, int height) {
    //ui is the GUI object declared as a field of this object
    ui = new UI(width, height);
    ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ui.setVisible(true);
}

这是否意味着当我点击窗口上的X按钮时,与此程序相关的所有内容(例如自动转换线程,分配给此程序的内存中的所有内容)都会被清除,并且将来不会减慢计算机速度?

或者,System.exit(0)是否需要以某种方式进行,以便在计算机启动并关闭应用程序后从未打开过该应用程序?

提前致谢!

1 个答案:

答案 0 :(得分:1)

根据JFrame API

  

public void setDefaultCloseOperation(int operation)
  设置用户启动"关闭"默认情况下将发生的操作。在这个框架上。您必须指定以下选项之一:

     
      
  • DO_NOTHING_ON_CLOSE(在WindowConstants中定义):不要做任何事情;要求程序在已注册的WindowListener对象的windowClosing方法中处理操作。
  •   
  • HIDE_ON_CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListener对象后自动隐藏框架。
  •   
  • DISPOSE_ON_CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListener对象后自动隐藏和处置框架。
  •   
  • EXIT_ON_CLOSE(在JFrame中定义):使用系统退出方法退出应用程序。仅在应用程序中使用它。
  •   

所以是的,这将通过为您调用System exit来退出应用程序。

只是一个小小的警告:如果您的线程连线不正确,并且您有长时间运行的代码恰好占用了Swing事件线程,EDT,那么JFrame的终止按钮就不会出现问题在EDT解除阻止之前做出回应。

侧面建议2,关于:

  

我有一个扩展JFrame的GUI ...

我建议不要创建扩展顶级窗口的类,例如JFrame,因为这会创建只能用作JFrame的不灵活的类。更好地设置GUI类来创建(或者如果需要,扩展)JPanel,因为这样你的GUI可以在许多不同的上下文中显示 - 在JFrame,JDialog,在另一个JPanel中,在JTabbedPanel中......释放你的代码。

方面建议3:关于在Swing应用程序中创建新线程,如果自动点击器将与Swing应用程序本身交互,那么您可能希望考虑使用SwingWorker来帮助创建后台线程,因为此构造中包含机制这有助于在不破坏Swing线程规则的情况下在后台线程和GUI之间进行安全通信。 Google" Swing中的并发"了解更多信息。