Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭JFrame时,程序中的所有内容都会终止吗?_Java_Multithreading_Swing_Jframe - Fatal编程技术网

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

Java 关闭JFrame时,程序中的所有内容都会终止吗?,java,multithreading,swing,jframe,Java,Multithreading,Swing,Jframe,我有一个扩展JFrame的GUI,它是由另一个对象的构造函数创建的: 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); }

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

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);
}
当单击某些按钮时,GUI的eventListener还会创建新线程:

public void actionPerformed(ActionEvent actionEvent) {  
    if(actionEvent.getSource().equals(ui.play)) {
        if(clickerThread == null) { 
            autoClicker= new AutoClicker();
            clickerThread = new Thread(autoClicker);
            clickerThread.start();
        }   
    }
}
这是否意味着,当我点击窗口上的X按钮时,与此程序相关的所有内容(如autoclicker线程、分配给此程序的内存中的所有内容)都将被清除,并且将来不会降低计算机的速度

或者,是否需要System.exit(0),以使计算机启动并关闭应用程序后,该应用程序似乎从未打开过

提前谢谢

根据:

public void setDefaultCloseOperation(int操作)

设置当用户在此帧上启动“关闭”时默认情况下将发生的操作。必须指定以下选项之一:

  • 关闭时不执行任何操作(在WindowConstants中定义):不执行任何操作;要求程序处理已注册WindowListener对象的windowClosing方法中的操作
  • HIDE_ON_CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListener对象后自动隐藏帧
  • DISPOSE_ON_CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListener对象后自动隐藏和处置帧
  • 关闭时退出(在JFrame中定义):使用系统退出方法退出应用程序。仅在应用程序中使用此选项
是的,这将通过调用System exit为您退出应用程序


只是一个小小的侧面警告:如果线程连接不正确,并且长时间运行的代码恰好绑定了Swing事件线程EDT,那么JFrame的终止按钮将在EDT被解锁之前不会响应


补充建议2,关于:

我有一个扩展JFrame的GUI

我建议不要创建扩展顶级窗口(如JFrames)的类,因为这样会创建只能用作JFrames的不灵活类。更好的方法是让您的GUI类创建(或者如果需要,扩展)JPanel,因为这样您的GUI可以在许多不同的上下文中显示——在JFrame、JDialog、另一个JPanel、JTabbedPanel中。。。它会释放你的代码一点


附带建议3:关于在Swing应用程序中创建新线程,如果auto clicker将与Swing应用程序本身交互,然后,您可能希望考虑使用SWIFEWORKER来帮助创建后台线程,因为该构造中的机制有助于后台线程和GUI之间的安全通信,而不会破坏摆动线程规则。谷歌“Swing中的并发”获取更多信息