【问题标题】:GUI isn't shown while thread is in procces in JAVA在 JAVA 中处理线程时不显示 GUI
【发布时间】:2011-12-26 03:48:16
【问题描述】:

我正在用非常简单的线程制作简单的游戏(1 秒延迟) 线程有问题,我有 while(true) 循环代码:

try {
    while (true) {
       Ltimer.setText(getTimeElapsed());
       Thread.currentThread();
       Thread.sleep(1000); // Thread sleeping for 1 second           
    }
} catch (Exception e) {
    JOptionPane.showMessageDialog(null, "error with timer");       
} 

它只是每秒获取字符串并更新标签文本 当我尝试运行它时,gui 冻结,我只能在黑色背景中看到标签,所有按钮和 bg img 都消失了。试图修复 setVisible() repaint() 但一无所获..

还有其他选择吗?

【问题讨论】:

    标签: java multithreading swing user-interface concurrency


    【解决方案1】:

    在 EDT 期间不要使用Thread#sleep(int),那么您对Concurency in Swing 有疑问,如果您需要延迟任何操作,请使用java.swing.Timer,例如EDT lack here

    【讨论】:

      【解决方案2】:

      我的猜测是您正在使用 GUI 事件线程来执行此操作。当您将 GUI 线程捆绑做其他事情时,它也不能更新屏幕。我建议您运行一个新线程来执行此操作。

      【讨论】:

        【解决方案3】:

        您不得在事件分派线程之外使用 Swing 组件。见http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

        每次您的线程必须更改 UI 中的某些内容时,请使用 SwingUtilities.invokeLater。或者使用 Swing Timer

        如果这个无限循环实际上在 EDT 中,那么它会在运行时阻止所有 UI 事件、重绘等。所以你应该在一个单独的线程中运行这个循环。

        【讨论】:

          【解决方案4】:
          猜你喜欢
          • 1970-01-01
          • 2023-03-29
          • 2016-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-16
          • 2013-04-29
          相关资源
          最近更新 更多