Как обновить JLabel в Swing? - PullRequest
       13

Как обновить JLabel в Swing?

4 голосов
/ 19 марта 2010

Я пытаюсь использовать Swing Timer, и я хотел начать с очень простой программы. У меня есть окно с текстом: «У вас есть n секунд», где n меняется с 10 до 0 каждую секунду.

Я знаю, как создать окно с текстом. И я понимаю, как работает таймер (он периодически запускает действие). Но я не могу понять, как расчесывать эти две вещи. Должен ли я использовать это: JLabel label = new JLabel(myMessage);, а затем с таймером мне нужно обновить переменную "myMessage"?

Но я думаю, что мне нужно «заставить» мое окно «обновлять» себя (для отображения нового значения, сохраненного в «myMessage»).

Ответы [ 2 ]

7 голосов
/ 19 марта 2010

Я предлагаю вам вызывать метод <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JLabel.html#setText(java.lang.String)" rel="noreferrer">JLabel#setText</a> каждый раз, когда содержимое обновляется. однако из-за очень монотонной природы Swing вам необходимо обновить его виджеты в так называемой потоке диспетчеризации событий (EDT). Для этого рассмотрите возможность вызова SwingUtilities.invokeLater или SwingUtilities.invokeAndWait в коде таймера.

Таким образом, когда текст будет изменен из-за вашего вызова setText, события JLabel будут распространяться правильно, а метка будет корректно обновляться.

4 голосов
/ 19 марта 2010

Привет, бро, используй шаблон наблюдателя. То есть ваш класс пользовательского интерфейса должен быть слушателем вашей структуры таймера. Когда ваша переменная изменится, вызовите слушатели вашего таймера, который является вашим пользовательским классом.

//your observer class 

update(Object obj){

label.setText(obj.toString());
}
...

//your observable class
//when timer changes varible's value  you should call invokeListeners() 


invokeListener(){

for(Listener listener :listeners)
listener.update(getSecond());
}

Я не знаю ваш класс и структуру. Но я использовал это решение в одном из своих заданий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...