【发布时间】:2013-02-15 14:40:49
【问题描述】:
private void addSomeComponentsToFrame(){
JFrame frame = new JFrame();
.....
frame.setVisible(true);
frame.getContentPane().validate();
frame.getContentPane().repaint();
runOtherTask();
}
我想在 runOtherTask 方法启动之前查看框架对象及其组件,但是当我尝试运行 addSomeComponentsToFrame 方法时,框架出现(作为黑色矩形)但会冻结,并且在 runOtherTask 方法完成后它会在屏幕上显示框架的组件。
【问题讨论】:
-
您可以使用
SwingUtilities.invokeLater来防止使用多个线程,这样可以确保绘制完成后执行runOtherTask()。但是,如果runOtherTask()是一个长时间运行的任务,最好在专用线程中执行并保持 EDT 响应。 -
@ExtremeCoders,我不明白在这里使用
SwingUtilities会有什么帮助。它要做的就是将runOtherTask事件放在事件队列的末尾,这就是它的位置在这种情况下会不管。 -
@mre 我认为他的意思是仅在 EDT 上创建 Frame 并在 EDT 之外调用该方法,因此它将阻塞初始线程而不是 GUI EDT
-
我找到了 JComponent.paintImmediately 方法,但我不明白。
-
JComponent.paintImmediately 不适用于 JFrame
标签: java multithreading swing jframe