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

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

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

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

谢谢。

你选择的答案有点尴尬。 使用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(); } 

所有Swing组件(包括JFrame)都由一个称为Event Dispatch Thread或EDT的线程管理。 (可以从其他线程调用Swing对象上的方法,但这通常是不安全的,除了在这里不相关的一些情况。)

你可能通过将数据validation和执行代码放在它自己的对象中来完成你想要的东西,否则它完全不知道外面的世界。 然后,从另外两个对象中调用它:一个管理GUI,另一个以“自动模式”运行。

您可以从线程引用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(); } }