【问题标题】:Update JLabel from another thread从另一个线程更新 JLabel
【发布时间】:2011-05-05 09:31:30
【问题描述】:

亲爱的, 我有摆动相关的问题。我不能分享代码,因为它违反了公司政策,所以我会尽力解释这个问题。

简而言之,我创建了一个扩展包含 JLabel 的 JWindow 的类。这个 JLabel 的文本通过一个计时器对象随机更新,该对象使用 scheduleAtFixedRate 方法每 50 毫秒实例化一个 TimerTask。 JLabel 中的值是通过在一个单独的线程(我们称之为传输线程)中调用一个方法来检索的,该线程处理将数据传输到某个设备。问题是 JWindow 出现在屏幕上没有任何内容,直到传输到设备结束,然后我会得到传输线程的最后一个结果。会有什么问题?

【问题讨论】:

  • 你能分享说明问题的不同代码吗?
  • 我的猜测是您正在 GUI 线程中访问设备,这会阻止 GUI 更新。当您希望它更新 GUI 时,您需要确保 GUI 线程没有在设备上阻塞或锁定。
  • 不,彼得,我实际上是从中介类创建 JWindow 对象。中介类在首次加载时启动传输线程。同样的中介类有一个 JButton,它通过调用传输线程中的方法来启动数据传输。就在传输开始之前,这个中介类创建了一个 JWindow,其中包含一个 JLabel,它从传输线程中的一个函数更新它的值。
  • 您需要获取堆栈跟踪以了解应用程序在应该更新 JWindow 时正在做什么,但实际上没有。
  • “我不能共享代码,因为它违反了公司政策,”这有什么关系?我们从不要求您提供生产代码。我们要求一些可以证明问题的东西。创建 SSCCE 的重点是删除不必要的代码。您的问题只是关于计时器。值得注意的是,每个人都使用定时器。

标签: java multithreading swing jlabel jwindow


【解决方案1】:

javax.swing.Timer 代替java.util.Timer 可能更方便,如example 所示。

【讨论】:

    【解决方案2】:

    问题在于您在事件调度线程 (EDT) 之外的其他线程中访问 swing 组件。这是禁止的。

    每个 swing 组件的 javadoc 都有一个指向此页面的链接:http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading,其中详细解释了线程策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多