2013-12-01 1 views
1

JLabel (или любые другие JComponents), когда вы вызываете метод setText(), его значение изменилось, но внешний вид в пользовательском интерфейсе необходимо обновить позже. (по EDT?)Есть ли способ обновить текст JLabel в реальном времени и вручную?

И если вы заблокировали EDT, вся рамка замерзает. Поэтому моя проблема заключается в том, что я доволен эффектом «замораживания», который предотвращает отправку других действий. Однако я хочу, чтобы мои ярлыки и другие компоненты вывода продолжали обновляться. Поэтому я ищу метод, который обновляет внешний вид компонента вручную. В java API я нашел updateUI(), что кажется нецелесообразным.

Если вы знаете, любой метод, который может сделать как

label.setText("thanks!"); 
label.update(); 

Пожалуйста, скажите мне. Я буду очень благодарен.

ответ

3

Не замораживайте поток событий Swing, период. Когда вы это делаете, он не может выполнять какие-либо свои задачи, такие как рисование и взаимодействие с пользователем, и если он не отображается, он не обновляется, независимо от того, что вы пытаетесь сделать. Просто как тот.

+0

Является ли EDT такой независимой вещью, что вы просто передаете вам запрос, будучи неспособным контролировать его? – bijiDango

+0

@bijiDango: как я понимаю, да, но я полагаю, что ничего не написано на камне. Но тогда вы говорите о кодировании ниндзя, и вам лучше знать и понимать исходный код Swing, прежде чем возиться с ним. –

2

Есть ли способ обновить текст JLabel в реальном времени и вручную?

Нет, сделайте это по EDT.

1

Шаг 1) Не блокируйте поток отправки событий.
Шаг 2) Обновите ярлык, как обычно, путем вызова setText.

0

Вот как я установил бы свою JLabel для обновления со временем &.

SimpleDateFormat SimpleDay = new SimpleDateFormat("EEEE"); 
    SimpleDateFormat SimpleDate = new SimpleDateFormat("dd MMMM yyyy"); 
    SimpleDateFormat SimpleTime = new SimpleDateFormat("H:mm:ss"); 

    Timer SimpleTimer = new Timer(1000, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      jLabel1.setText(SimpleDay.format(new Date())); 
      jLabel2.setText(SimpleDate.format(new Date())); 
      jLabel3.setText(SimpleTime.format(new Date())); 
     } 
    }); 
    SimpleTimer.start(); 

Это затем добавляют к главному классу и jLabel1/2/3 обновляется с таймером.