【问题标题】:Change a JLabel Text while an JButton listener is working在 JButton 侦听器工作时更改 JLabel 文本
【发布时间】:2017-04-07 23:29:24
【问题描述】:

我有一个 JButton,我们称它为“按钮”并向其添加一个 ActionListener:

button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
        call();
    }
});

它已正确添加到我的框架等中。在那个 JFrame 中,我还有一个 JLabel,我想在 JButton 方法工作时更改它的文本(因为它需要大约 30 秒才能完成)。我怎么做?我必须使用一些多线程的东西吗? 这是基本原理(JLabel称为输出):

public void call(){
    output.setText("test1");
    try { Thread.sleep(1000);
    } catch (InterruptedException e) {}
    output.setText("test2");
}

这将导致“输出”标签在一秒钟后更改为“test2”。如何让它立即显示“test1”?

【问题讨论】:

  • 删除output.setText("test1");之后的所有内容...

标签: java multithreading swing jbutton jlabel


【解决方案1】:

不要使用 Thread.sleep()。这将防止 GUI 重新绘制自身。

我必须使用一些多线程的东西吗?

是的。

对于长时间运行的任务,您需要启动一个单独的Thread,以便 GUI 可以保持响应。

在这种情况下,您可以使用SwingWorker

阅读 Concurrency 上的 Swing 教程部分,了解更多信息和使用 SwingWorker 的示例。

【讨论】:

  • 好吧,当方法工作时,按钮保持按下状态是有意义的,因为你可以 1) 查看脚本何时完成 2) 在它完成之前不要再次按下它已经结束了
  • @Xerus,不,这没有意义。您不应该设计一个在每次调用长时间运行的任务时都会冻结的应用程序。如果你想给用户视觉反馈,那么你应该使用JProgressBar。阅读 How to Use Progress Bars 上的 Swing 教程部分了解更多信息。
  • 谢谢!当我做一个更复杂的项目时,我会更深入地研究它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2020-01-07
相关资源
最近更新 更多