【问题标题】:Why can't I make a call to a function while in a thread?为什么我不能在线程中调用函数?
【发布时间】:2018-08-30 22:34:51
【问题描述】:

我正在对 JFrame 窗口上的后台进程进行多线程处理,并且我想更新函数内的全局 JLabel 变量的文本。

所以当线程运行时,我的 while 和 for 循环会运行,但在它们运行期间,它会调用另一个函数来更改文本。

但是,它不会更新,直到线程完成执行(即循环完成时)。发生这种情况的任何原因,以及如何解决这个问题?

如果我尝试只更改线程内 JLabel 的文本,它会得到相同的结果。

【问题讨论】:

  • 听起来您正在尝试从事件调度线程中更新 ui,从而阻止更新 ui - 您最好证明一个可运行的示例来证明您的问题
  • 您考虑过使用progress bar吗?
  • 我试图改写您的问题以使其更好地阅读。但是,cmets 是正确的:A)多线程和摆动很复杂,您是否使用正确的方法 B)可能是您应该查看的进度条 C)请阅读 minimal reproducible example 然后编辑/增强您的问题相应地。
  • 使用 SwingWorker 在长时间运行的任务/操作时更新 GUI

标签: java multithreading swing methods jlabel


【解决方案1】:

可能发生的情况是您的线程确实进行了更改,但在 Swing 事件调度线程出现并更新显示之前,屏幕显示不会更新。建议使用 Swing 事件调度线程调用用户界面更新方法并且更安全。您可以通过将 gui 更新代码放入此方法中来做到这一点:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // call gui update here
    }
});

这仍然不能解决您的问题(更新发生在线程完成执行后)。这只是为了明确说明您在这里处理两个线程。您在单独线程上的 for 循环可能会首先完成,因为绘图线程通常较慢。但是,了解这一点将帮助您计划将哪些代码传递给 Swing 事件调度线程。如果你真的希望 for 循环在那个时间点更新,那么你可以将整个 for 循环放在 invokeLater() 中。

【讨论】:

    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多