如何让线程等待JFrame在Java中关闭?

2022-09-02 03:34:30

当程序启动时,将创建一个新的 JFrame。用户单击开始按钮后,将创建并启动一个线程。此线程执行的一部分是验证表单上的数据,然后使用该数据执行。验证数据后,线程在原始帧上调用 dispose(),然后创建一个充当控制面板的新 JFrame。

还有一个程序的自动模式,它根本不显示任何GUI,这种模式从配置文件中读取数据,然后启动执行线程并运行所有内容,但没有控制面板。

我希望程序在线程完成后结束,但在GUI模式下,只有当用户也关闭了控制面板时。是否可以使线程等待帧关闭。我假设框架是从它自己的线程运行的?或者事实并非如此。

谢谢。


答案 1

你选择的答案有点尴尬。使用 Thread.sleep(1000) 将每秒检查一次窗口状态。这不是性能问题,而只是糟糕的编码风格。您可能有一秒钟的响应时间。

这个代码稍微好一点。

private static Object lock = new Object();
private static JFrame frame = new JFrame();
/**
 * @param args
 */
public static void main(String[] args) {

    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    frame.setVisible(true);

    Thread t = new Thread() {
        public void run() {
            synchronized(lock) {
                while (frame.isVisible())
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                System.out.println("Working now");
            }
        }
    };
    t.start();

    frame.addWindowListener(new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent arg0) {
            synchronized (lock) {
                frame.setVisible(false);
                lock.notify();
            }
        }

    });

    t.join();
}

答案 2

您可以从线程引用 JFrame。然后将 JFrame 的默认关闭操作设置为 HIDE_ON_CLOSE。如果 JFrame 已关闭,则可以停止该线程。

示例代码:

import java.awt.Dimension;

import javax.swing.JFrame;

public class FrameExample extends JFrame {

    public FrameExample() {
        setSize(new Dimension(100, 100));
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        setVisible(true);

    }

    private static class T implements Runnable {

        private FrameExample e;

    public T(FrameExample e) {
        this.e = e;
    }

    @Override
    public void run() {
        while (true) {
            if (e.isVisible()) {
                // do the validation
                System.out.println("validation");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    break;
                }
            }
        }
    }

}

public static void main(String[] args) {
    FrameExample frameExample = new FrameExample();

    new Thread(new T(frameExample)).start();
    }
} 

推荐