【问题标题】:Terminate a while loop when clicking JFrame.EXIT_ON_CLOSE单击 JFrame.EXIT_ON_CLOSE 时终止 while 循环
【发布时间】:2015-02-17 07:08:58
【问题描述】:

目前我有一个实时活动的 while 循环正在运行,它可以完成我想要的唯一问题是在 while 循环仍处于活动状态时关闭框架(退出应用程序)。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我尝试使用 if 语句终止循环

if (frame.getDefaultCloseOperation() == 3){
    running = false;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

不幸的是,一旦应用程序自动运行,就会立即将其设置为3,并且该过程无法正常工作。

如何通过单击要关闭的框架来设置running = false;。

我只想通过单击 connour 中的 X 来关闭应用程序,当有一个活动循环运行时这可能吗?

【问题讨论】:

  • 也许尝试启动另一个线程来监听关闭事件
  • if (frame.getDefaultCloseOperation() == 3) - 不要使用幻数。没有人知道(或关心)3 是什么。使用 API 提供的字段名称。如果可以使用JFrame.EXIT_ON_CLOSE设置属性,可以使用合适的变量名来测试属性。

标签: java swing while-loop terminate


【解决方案1】:

有几种方法可以实现你想要的。

  1. 在daemon thread 中运行循环。这样的线程不会阻止应用程序停止。只需be careful when you call swing code from such a thread。

  2. 这个问题解释了当用户试图关闭窗口时如何显示一个确认对话框:Java - Message when closing JFrame Window

    把running = false;放在那里而不是对话框。

    注意:如果您在 Swing 线程中运行循环,则 Swing 无法响应该事件。在这种情况下使用解决方案 #1。

【讨论】:

  • 1+ 用于守护线程,非常有趣的话题。另一种方法是使用 SwingWorker 在后台线程中执行 while 循环。它提供了在 WINDOW_CLOSING 事件上停止(取消)SwingWorker 并在退出应用程序之前执行任何应该做的事情(即:释放资源、关闭数据库连接(如果打开)等)的可能性。换句话说,它为您提供了另一个正确关闭应用程序的机会。但是,正如您所说,有几种方法可以实现这一目标。
【解决方案2】:

只需在声明中设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,它将自动关闭循环

【讨论】:

    【解决方案3】:

    您正在设置默认关闭操作。 但是在您的代码中

    if (frame.getDefaultCloseOperation() == 3){
    

    仅检查关闭操作是否仍设置为 JFrame.EXIT_ON_CLOSE

    你想要的是响应关闭事件。 我怀疑你需要this answer

    设置框架时,在初始化块中添加一些代码

    addWindowListener(this);
    

    然后在同一个类中实现关闭窗口监听器:

    public void windowClosing(WindowEvent event) {
        running = false;
    }
    

    【讨论】:

      【解决方案4】:

      移除frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,添加windows监听器并手动关闭应用。

      frame.addWindowListener(new WindowAdapter() {
      
              @Override
              public void windowClosing(WindowEvent e) {
                  running = false;
              }
      
              @Override
              public void windowClosed(WindowEvent e) {
                 System.exit(0);
              }
      });
      

      【讨论】:

        猜你喜欢
        • 2017-03-10
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        相关资源
        最近更新 更多