только событие щелчка мыши для jlabel правильно обновляет свойство текста jlabel
Вопрос
Я использую поток Java для обновления текстового значения jlabel в своем приложении, но после обновления текста на Jlabel Jlabel показывает все прошлые обновленные значения и периодически новое значение в порядке с помощью самого освежения
но когда я использую ту же функцию обновления в событии мышиного щелчка jlabel, он обновляется, как я и ожидал, и показывает только последнее значение
Что может вызвать эту проблему, я упускаю некоторые методы, какие события MouseClick вызовывают?
nore: приложение - это japplet
Решение
Вы должны гарантировать, что любые изменения в компонентах пользовательского интерфейса Swing выполняются в потоке отправки событий.Вот два предложения для достижения этой цели:
Таймер
Вы можете проверить javax.swing.Таймер если целью является периодическое обновление JLabel
текст.Таймер срабатывает ActionEvent
s периодически в потоке отправки событий:
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());