【问题标题】:How can components work concurrently in JFrame?组件如何在 JFrame 中同时工作?
【发布时间】:2013-11-30 06:56:26
【问题描述】:

代码:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        textArea_output.append(new Date() + ": start\n");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e2) {
            e2.printStackTrace();
        }
        textArea_output.append(new Date() + ": end");
    }
});

输出:

Sat Nov 30 14:46:08 CST 2013: start
Sat Nov 30 14:46:13 CST 2013: end

问题是两个输出同时出现。而我想要的是,第一个,5 秒,然后是另一个。

我尝试了几种方法来解决它,但都失败了。按钮只是冻结了整个框架,即使是 textArea 也不会在此期间更新其内容。

【问题讨论】:

    标签: java swing jtextarea thread-sleep


    【解决方案1】:

    不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n) 实现一个摆动Timer 用于重复任务,或一个单一的镜头Timer 用于“延迟效果”。

    更多详情请见Concurrency in Swing

    【讨论】:

    • Java 文档、文本、示例让我感到沮丧。我现在正在使用工作线程,但为了 Oracle 给出的示例,我仍然不知道如何使用计时器。在我弄清楚之前,我想问另一个问题。当按下那个按钮时,我会调用一个已经存在并且其中包含Thread.sleep()的方法,会不会有问题?
    • blocking the EDT是什么以及如何避免它,我想我不明白。我需要一个简单的例子,一个切换按钮和一个标签。 toggleButton 使用 worker 和时钟不断更改标签上显示的数字。我认为这个例子会很简单,很有用。
    • "会不会有问题?" 是的。 “我需要一个简单的例子” 我需要一匹小马。如果您需要更多帮助,请发帖 SSCCE 尽最大努力。
    • 伙计,我并不想表现得粗鲁或贪婪。只要你能看看TumbleItem 的例子,就应该明白我的感受。
    • “了解我的感受”在开玩笑吗?这是一个技术论坛,而不是社交网站。 “只要你能看一下..” 只要你能真正阅读 SSCCE 文档并添加一个。当你无视我的建议时,你希望我能帮助你吗?
    【解决方案2】:

    这个page 有帮助。只需简单地启动一个新线程。 (我试过这个,但我不知道为什么那个时候它不起作用。

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多