private void addSomeComponentsToFrame(){
JFrame frame = new JFrame();
.....
frame.setVisible(true);
frame.getContentPane().validate();
frame.getContentPane().repaint();
runOtherTask();
}
我希望在runOtherTask方法启动之前看到框架对象及其组件,但是当我尝试运行addSomeComponentsToFrame方法时,框架出现(作为黑色矩形)但冻结,并且在runOtherTask方法完成后,它会在屏幕上显示框架的组件。
答案 0 :(得分:3)
当我尝试运行addSomeComponentsToFrame方法时,框架出现(如 黑色矩形)但冻结并在runOtherTask方法完成后 它在屏幕上显示框架的组件。
听起来你正在阻止Event Dispatch Thread
长时间运行的任务。
您可能希望将该任务从EDT卸载到单独的线程:
如果您更好地使用runOtherTask
中的Swing组件:
否则你可以使用(注意下面没有在GUI Event Dispatch Thread
中运行,因此不允许在其中操作Swing组件):
正如旁注不需要:
frame.getContentPane().validate();
frame.getContentPane().repaint();
简单地:
frame.validate();
frame.repaint();
此外,如果您的Java版本允许使用revalidate()
而不是validate()
。但是,只有在可见容器中添加/删除组件时才需要这些。