我使用的是Java线程在我的应用程序更新的JLabel文本值 但之后更新文本的JLabel JLabel的周期性表示通过刷新本身为了所有过去的更新值和新值

但是当我使用相同的更新功能的JLabel的鼠标点击事件内它被更新本身作为我预期并且仅示出最后一个值

什么可能导致此问题 我失去了一些方法,这些鼠标点击事件内部调用?

诺雷:应用是JApplet的

有帮助吗?

解决方案

您必须确保任何更改UI组件的事件指派线程进行摆动。下面是用于完成此两个建议:

<强>定时器

您可能想看看的javax.swing .Timer 如果目的是定期刷新JLabel文本。计时器触发ActionEvents定期对事件指派线程:

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

<强>的SwingWorker

另外,你可能要考虑使用的SwingWorker 执行你的后台处理。背景工作线程可以通过调用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();

其他提示

不知道到底发生了什么,但我会通过确保您的更新发生在事件调度线程启动。让你的更新线程调用:

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

请参阅事件指派线程教程。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top