只有鼠标点击事件的jlabel正确更新jlabel文本属性

时间:2009-11-06 08:27:03

标签: java swing jlabel

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

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

什么可能导致这个问题 我错过了一些鼠标点击事件内部调用的方法吗?

nore:应用程序是japplet

3 个答案:

答案 0 :(得分:3)

不确定究竟发生了什么,但我首先要确保您的更新发生在事件派发线程中。让你的更新程序线程调用:

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

请参阅Event Dispatch Thread教程。

答案 1 :(得分:2)

您必须确保在Event Dispatch Thread上执行对Swing UI组件的任何更改。以下是完成此操作的两个建议:

<强>定时器

如果目的是定期刷新JLabel文字,您可以查看javax.swing.Timer。计时器在事件调度线程上定期触发ActionEvent

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

<强>的SwingWorker

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

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();

答案 2 :(得分:1)

为什么不试试这个: 的标签 .paintImmediately(的标签 .getVisibleRect());