public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { JOptionPane.showMessageDialog(null, "休息20s"); new Thread(() -> { try { Thread.sleep(3 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } JOptionPane.getRootFrame().dispose(); }).start(); } }, 0, 1 * 60 * 1000); },这段代码中,JOptionPane.getRootFrame().dispose();并未生效,怎么改
时间: 2023-05-30 08:04:11 浏览: 117
善处理?
首先,需要理解JOptionPane.getRootFrame()返回的是对话框所在的顶级窗口,而dispose()方法则是关闭并释放该窗口及其所有子组件所占用的资源。在多线程环境下,可能会出现dispose()方法无法生效的情况,因为该方法只能在事件分派线程(Event Dispatch Thread)中被调用。因此,可以使用SwingUtilities.invokeLater()方法将dispose()方法的调用放到事件分派线程中执行,代码如下:
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "休息20s");
new Thread(() -> {
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(() -> {
JOptionPane.getRootFrame().dispose();
});
}).start();
}
}, 0, 1 * 60 * 1000);
}
这样,就可以在多线程环境下正确地关闭对话框及其所有子组件。
阅读全文