2014-02-21 1 views
1

netbeans gui에서 일종의 애니메이션을 만들어야했습니다. 그래서 인터넷에서 스윙 타이머에 대해 공부하고 있었고 특정 시간 이후에 jLabel에서 이미지를 변경하는 방법을 발견했습니다.특정 간격 후에 jLabel에서 이미지를 변경

public void animation() throws InterruptedException { 
    ActionListener taskPerformer = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      //...Perform a task... 
      t++; 
      System.out.printf("Reading SMTP Info. %d\n",t); 
      if(t%2==1){ 
       jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/oncsreen_keypad/a.jpg"))); 
      } 
      else{ 
       jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/oncsreen_keypad/b.jpg"))); 
      } 
     } 
    }; 
    Timer timer = new Timer(1000 , taskPerformer); 
    //timer.setRepeats(false); 
    timer.start(); 

    Thread.sleep(5000); 
} 

이 방법은 아무데도 호출되지 않습니다. 그러나 System.out.printf가 작동하면 jLabel에서 이미지를 변경해도 작동해야합니다. 하지만 실제로 실행중인 라인은 jLabel에 영향을 미치지 않습니다.

그래서 올바른 접근 방식이되어야합니다.

+0

에게 도움이? – vanza

+1

질문을 편집하여 설명하는 문제가있는 [* 최소, 완료, 테스트되고 읽을 수있는 예 *] (http://stackoverflow.com/help/mcve)를 포함하십시오. 몇 가지 예제가 인용 [여기] (http://stackoverflow.com/a/14432646/230513). – trashgod

+0

이 [보기] (http://stackoverflow.com/a/10837751/1057230)를보십시오. 추가로 [links] (http://stackoverflow.com/a/9866659/1057230) 도움이 될 수도 있습니다 :-) –

답변

2

Thread.sleep ..으로 주 스레드를 멈추지 말고 스윙 타이머를 사용하여 이미지가 변경되어야 할 때까지 지연을줍니다.

작은 예제를 만들었습니다.

JLabel이 포함 된 JPanel로 JFrame을 생성하는 클래스입니다.

package timerdemo; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/** 
* 
* @author ottp 
* @version 1.0 
*/ 
public class Gui extends JFrame { 

    private JLabel jLabel; 
    private Timer timer; 
    private boolean chromeShown; 

    public Gui() { 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(800, 600); 
     JPanel panel = new JPanel(new BorderLayout()); 
     jLabel = new JLabel(new ImageIcon("/home/ottp/Downloads/chrome.png")); 
     chromeShown = true; 

     panel.add(jLabel); 
     timer = new Timer(5000, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(chromeShown) { 
        jLabel.setIcon(new ImageIcon("/home/ottp/Downloads/ok.png")); 
        chromeShown = false; 
       } else { 
        jLabel.setIcon(new ImageIcon("/home/ottp/Downloads/chrome.png")); 
        chromeShown = true; 
       } 
      } 
     }); 
     timer.start(); 

     this.getContentPane().add(panel); 
     this.setVisible(true); 
    } 
} 

그리고 그것을 시작 ...

package timerdemo; 

import javax.swing.SwingUtilities; 

/** 
* 
* @author ottp 
*/ 
public class TimerDemo { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Gui(); 
      } 
     }); 

    } 
} 

당신의 GUI 클래스의 타이머를 시작한 후 JLabel의에 이미지가 5 초마다 변경됩니다, 이에 대한 조건은 부울 플래그입니다. if ... else를 사용할 수도 있습니다.

희망이

패트릭 곳이라고하지 않습니다 방법

+1

스윙 개발자로서, 우리가 신경 쓰지 않는 주 스레드, 우리가 신경 쓰는 것 이벤트 디스패치 스레드. [초기 스레드] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)를 참조하십시오. – MadProgrammer

+1

예를 들어 이미지를 가져 오는 한 가지 방법 (모든 사람들에게 효과적입니다.) [이 답변] (http://stackoverflow.com/a/19209651/418556)에 표시된 이미지로 핫 링크하는 것입니다. –

관련 문제