好的,我已经阅读了整个网络的搜索,但我还没有找到解决我的问题的方法,也许我错过了一些简单的东西,因此我在这里......
我有一个相当大的项目,它处理维修业务的工作订单。它都是连接数据库的,很多很多页的代码和类。但我只是在前端添加了一小段代码,基本上检查我们的笔记区域中的新消息。
无论如何,我用两个JLabel显示一个简单的JFrame ,而一个单独的线程查询数据库。这一切都发生在程序开始时。问题是我的小“请稍候” JFrame在等待期间(这是程序加载的其余部分,而不是数据库线程)提出了它的框架,但没有胆量,没有背景,也没有JLabel ,后记它显示,但到那时它就失去了意义。
我编写了以下示例程序。它显示一个简单的JFrame(CheckingMessagesGUI:一个带有两个JLabel的JFrame,仅此而已)休眠 5 秒,然后显示示例(主程序)JFrame,然后在此示例中立即关闭(),当然我的真实程序继续执行多很多。我发现这似乎是导致问题的原因。一旦睡眠定时器用完,窗口就会显示出来,但是显示它的代码是在命令之前给出的,应该按照这个顺序完成吗?System.exit(0)
invokeLater
Thread.sleep
我的问题是为什么会invokeLater
导致我的JFrame无法正确显示?
我的理解是,目的invokeLater
是让项目在正确的 AWT 事件线程上运行,这会让我认为这个窗口会被正确绘制。无论如何,我确定我遗漏了一些明显的东西。我在下面的代码中注释掉了这invokeLater
部分,它运行正常,如果你把它放回去它不会......
提前谢谢了。
package javaapplication6;
public class Example extends javax.swing.JFrame {
public Example() {
System.out.println("Example started");
setBounds(100,100,200,200);
System.out.println("cmGUI instantiated");
CheckingMessagesGUI cmGUI = new CheckingMessagesGUI();
System.out.println("Set cmGUI visible");
cmGUI.setVisible(true);
cmGUI.validate();
try {
System.out.println("timer started");
Thread.sleep(5000);
System.out.println("timer done");
} catch(InterruptedException e){
}
System.exit(0);
}
public static void main(String[] args) {
/*java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() { */
System.out.println("Started");
System.out.println("example Instantiated");
Example example = new Example();
System.out.println("example visible");
example.setVisible(true);
/* }
});
*/
}
}
更新:为了澄清,我意识到Thread.sleep()
会阻止一切,但我的 CheckingMessagesGUI 不应该在我调用睡眠之前已经完全绘制吗?这就是问题所在。