2

我正在使用 java 线程更新我的应用程序中的 jlabel 文本值,但是在它更新 jlabel jlabel 上的文本之后,通过刷新本身定期显示所有过去更新的值和新值

但是当我在 jlabel 的 mouseclick 事件中使用相同的更新函数时,它会按照我的预期更新自身并仅显示最后一个值

什么会导致这个问题我错过了mouseclick事件内部调用的一些方法?

nore:应用程序是 japplet

4

3 回答 3

3

不确定到底发生了什么,但我会首先确保您的更新发生在事件调度线程中。让您的更新程序线程调用:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    // ...update the text...
  }
});

请参阅事件调度线程教程。

于 2009-11-06T08:31:15.680 回答
2

您必须确保对 Swing UI 组件的任何更改都在事件调度线程上执行。以下是实现此目的的两个建议:

定时器

如果目的是定期刷新文本,您可能需要检查javax.swing.Timer 。JLabel计时器ActionEvent在 Event Dispatch Thread 上定期触发 s:

  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          label.setText("foo");
      }
  };
  new Timer(delay, taskPerformer).start();

摇摆工人

或者,您可能需要考虑使用SwingWorker来执行后台处理。后台工作线程可以通过调用将信息传回 Event Dispatch 线程publish

new SwingWorker<Void, String>() {
  // Called by the background thread.
  public Void doInBackground() {
    for (int i=0; i<100; ++i) {
      // Do work.  Periodically publish String data.
      publish("Job Number: " + i);
    }
  }

  // Called on the Event Dispatch Thread.
  @Override
  protected void process(List<String> chunks) {
    // Update label text.  May only want to set label to last
    // value in chunks (as process can potentially be called
    // with multiple String values at once).
    for (String text : chunks) {
      label.setText(text);
    }
  }  
}.execute();
于 2009-11-06T09:01:40.373 回答
1

你为什么不试试这个: labelname .paintImmediately( labelname .getVisibleRect());

于 2009-12-24T06:06:07.957 回答