2017-11-15 1 views
3

이미지를 클릭 할 때 다른 이미지가 1 초 동안 일시 중지되고 원래 이미지가 복원되어 다시 표시되기를 원합니다. 시도 할 때 그것은 아래에 주어진 코드는 내가초보자이며 netbeans에서 카드 뒤집기 게임을 만들려고합니다

private void jButton16ActionPerformed(java.awt.event.ActionEvent evt) {           
    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png")); 
    try {   //sleep 1 seconds 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    {     
    } 

    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg"));  }           
+3

시작 자세한 내용은 Concurrency in SwingHow to use Swing Timers를 참조 스윙을 사용 concurrency/index.html)를 검토 한 다음 가능한 [Swing Timers 사용] (https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)을 살펴보십시오. 솔루션 – MadProgrammer

+0

[예제에서 보셨을 수도 있습니다 (https://stackoverflow.com/questions/16292498/swingworker-thread-sleep-or-javax-swing-timer-i-need-to-insert-a- 일시 중지/16293498 # 16293498) 기본적으로 수행하려는 작업을 수행합니다. – MadProgrammer

답변

2

당신은 Event Dispatch Thread 내부 Thread.sleep()를 호출 할 수 없습니다 것을 달성 할 수있는 방법을 다시 표시 할 .I 이미지가 일시 정지를 표시 할 수면 후 이미지와 원본을 설정하는 등의 액션 핸들러를 IT Thread.sleep()이 이벤트 발송 스레드를 차단하고 사용자의 UI가 고정으로 설정되어 있기 때문에 을 얻는 대신 Timer을 사용하여 달성 할 수 있습니다

코드 아래 참조 전자 목표,

jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png")); 
    Timer timer = new Timer(1000, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg")); 
     } 
    }); 
    timer.setRepeats(false); 
    timer.start(); 
+0

UI의 컨텍스트 외부에서 UI를 업데이트하거나 수정하면 안됩니다. Swing 'Timer'는 더 간단하고 안전한 솔루션입니다. – MadProgrammer

2
  • 스윙는 스레드로부터 안전하지 않습니다 스레드에게
  • 스윙을 파견 이벤트의 컨텍스트 내에서 장기 실행 또는 차단 작업을 수행해서는 안, 단일 스레드입니다 , 즉 EDT의 컨텍스트 외부에서 UI (및 UI에 필요한 모든 것)를 업데이트해서는 안됨을 의미합니다.

가장 간단한 해결책은 t 오 [스윙의 동시성 (https://docs.oracle.com/javase/tutorial/uiswing/에 모습을 복용하여 Timer

private void jButton16ActionPerformed(java.awt.event.ActionEvent evt) {           
    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png")); 
    Timer timer = new Timer(1000, new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg"));  
     } 
    }); 
    timer.setRepeats(false); 
    timer.start(); 
}   

관련 문제