【发布时间】:2009-12-03 23:02:16
【问题描述】:
好的,我已经阅读了整个网络的搜索,但我还没有找到解决我的问题的方法,也许我错过了一些简单的东西,因此我在这里......
我有一个相当大的项目,它处理维修业务的工作订单。它都是连接数据库的,很多很多页的代码和类。但我只是在前端添加了一小段代码,基本上检查我们的笔记区域中的新消息。
无论如何,我显示一个简单的 JFrame 和两个 JLabel,同时一个单独的线程查询数据库。这一切都发生在程序开始时。问题是我的小“请稍候”JFrame 在等待期间出现了它的框架,但没有胆量,没有背景,也没有 JLabels(这是其余的程序加载,而不是数据库线程),它显示的后缀,但到那时它失去了它的意义。
我编写了以下示例程序。它显示一个简单的 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 不应该在我调用 sleep 之前已经完全绘制吗?这就是问题所在。
【问题讨论】:
-
这个论坛被各种语言的程序员使用。问题的标签必须有助于立即识别域,以便读者能够过滤他们可能提供帮助的问题。 java 和 awt 会是你问题的好标签吗?
标签: java swing awt invokelater