2013-05-22 4 views
1

Мне нужно изменить значок jLabel каждые 2 секунды. Для этого я использую таймер и таймер, но он показывает только первое изображение. Вот код:Периодически меняйте значок JLabel

ImageIcon[] icons = {new ImageIcon(this.getClass().getResource("orange.jpg")), new  
    ImageIcon(this.getClass().getResource("cosmote.jpg")), new 
    ImageIcon(this.getClass().getResource("vodafone.jpg"))}; 
    java.util.Timer timer = new java.util.Timer(); 
    int indexIcon; 

А потом в конструкторе JFrame:

initComponents(); 
    open(fisierAgenda); 
    TimerTask task = new TimerTask() { 
     public void run() { 
      indexIcon=(indexIcon++)%3; 
      jLabel.setIcon(icons[indexIcon]); 
      jLabel.setText(""+indexIcon); 
     } 
    }; 
    timer.schedule(task, 0, 2000); 

Любая помощь будет оценена.

+0

Внедрите ** Swing ** 'Timer' для повторения задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). См. Также [рабочий пример] (http://stackoverflow.com/a/13512826/418556). –

ответ

3
  • у вас есть проблемы с Concurency in Swing

  • Swing is Single Threaded и все события должны быть сделаны на EDT

  • выход из util.Timer никогда не будет notifyed Event Dispatch Thread, без каких-либо изменений в уже видимом Swing GUI

  • Swing Timer, тогда вывод будет всегда производиться по EDT

-1

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

+1

Не посторонний, но все изменения и обновления для Swing GUI должны быть на EDT. –

+1

Не ни один из избирателей ни один: 1) Все обновления должны быть сделаны на EDT (так что проще всего использовать таймер Swing). 2) Начиная с Java 1.5 вам лучше использовать структуру 'Executors', а не создавать 'Thread' вручную. 3) При необходимости вы можете комбинировать 'Executors' и' SwingUtilities.invokeLater() ' –

Смежные вопросы