2013-11-30 5 views
0

Я использую таймер для изменения значка в JLabel каждую секунду. I инициализируется и начал таймер в конструкторе GUI:Timer Object wint aimate images

images[0] =new ImageIcon(getClass().getResource("connected.png")); 
     images[1] =new ImageIcon(getClass().getResource("notConnected.png")); 
     imageAnimator = new Timer(1000, animateImages()); 
     imageAnimator.start(); 

И завернутые метод вызовов таймера в виде SwingWorker нити:

private ActionListener animateImages() { 

     System.out.println("in animateIMages method"); 
     SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){ 
    protected Void doInBackground() throws Exception { 
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
        System.out.println("In swingworker "); 
        if (currentImage==0) { 
         currentImage=1; 
         connectionStatusLabel.setIcon(images[currentImage]); 
         System.out.println("in if currentImage==0: currentIMage should now be 1: "+ currentImage); 
        } 
        else { 
         currentImage=0; 
         connectionStatusLabel.setIcon(images[currentImage]); 
         System.out.println("in if else: currentIMage should now be 0: "+ currentImage); 
        }//end else 
        return null; 
       } 

      };//end worker thread 

Однако изображение меняется только один раз, когда первый, если заявление казнены. Заранее спасибо

ответ

2

И завернутые метод вызовов таймера в виде SwingWorker нити:

Вы не хотите, чтобы это сделать. Все обновления для графического интерфейса должны быть сделаны в EDT. Код в SwingWorker выполняется в отдельном потоке, который НЕ является тем, что вы хотите.

Единственный раз, когда вы можете использовать SwingWorker для этого, было бы, если вы читаете образ с диска. Затем рабочий код будет читать изображение, а затем опубликует() результат. В вашем случае похоже, что значок уже находится в памяти, поэтому нет необходимости в SwingWorker.

Просто используйте таймер и поменяйте значок в ActionListener напрямую.

+0

Спасибо. Удален рабочий поток Swing, но тот же результат. Кажется, метод ActionListener вызывается только таймером, а не каждую секунду .... – dancingbush

0

Got it. Пользовалась annonmonous ActionListner внутреннего класса в конструкторе Timer и работала отлично:

imageAnimator = new Timer(1000, new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent e) { 
    //change images here 

Спасибо за вход. C