только событие щелчка мыши для jlabel правильно обновляет свойство текста jlabel

StackOverflow https://stackoverflow.com/questions/1686188

  •  18-09-2019
  •  | 
  •  

Вопрос

Я использую поток Java для обновления текстового значения jlabel в своем приложении, но после обновления текста на Jlabel Jlabel показывает все прошлые обновленные значения и периодически новое значение в порядке с помощью самого освежения

но когда я использую ту же функцию обновления в событии мышиного щелчка jlabel, он обновляется, как я и ожидал, и показывает только последнее значение

Что может вызвать эту проблему, я упускаю некоторые методы, какие события MouseClick вызовывают?

nore: приложение - это japplet

Это было полезно?

Решение

Вы должны гарантировать, что любые изменения в компонентах пользовательского интерфейса Swing выполняются в потоке отправки событий.Вот два предложения для достижения этой цели:

Таймер

Вы можете проверить javax.swing.Таймер если целью является периодическое обновление 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