2013-03-05 5 views
1

클릭 할 때 간단한 JLabel이 "두 번째 텍스트"로 텍스트를 변경하게하는 간단한 JButton을 만들려고합니다. 그 후 현재 스레드가 몇 초 동안 잠자기 상태가되고 JLabel이 텍스트를 다시 변경하기를 원합니다. , 이번에는 "세 번째 텍스트"로 변경하십시오. 나는 그것이 여기에서 끝났다라고 생각한다. 그러나 그것이 내가 원하는 방법으로 작동하지 않는다. 아래에 제공된 코드는 JButton을 누른 상태에서 지정된 시간 동안 JButton을 고정시킨 다음 레이블을 세 번째 상태로 변경합니다. 즉, "초 텍스트"가 나타나지 않습니다.스레드가 제대로 잠자기 상태가 아닌 이유는 무엇입니까?

어떻게해야하는지 알려주세요.

감사합니다.

package testPackage; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Demo { 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame(); 
     JButton button = new JButton("Click me!"); 
     final JLabel label = new JLabel("first text"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 
     JPanel panel = new JPanel(); 
     panel.add(button); 
     panel.add(label); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setText("second text"); 
       try { 
        Thread.currentThread(); 
        Thread.sleep(4000); 
       } catch (InterruptedException exc) { 
        System.out.println("Erorrrrr"); 
       } 

      } 
     }); 

     frame.add(panel); 
     frame.setVisible(true); 
    } 

} 
+1

여기에 가장 자주 묻는 질문이 하나를 변경합니다. Event-Dispatch Thread를 잠자기 상태로 만들고 GUI를 고정시킵니다. 대신에 javax.swing.Timer를 사용하여 지연된 이벤트를 예약해야합니다. –

+3

제쳐두고, Thread.currentThread();가 성취하기를 기대하는 것은 무엇입니까? –

+0

세 번째 텍스트는 어디에 있습니까? – 11684

답변

0

이 두 번째 텍스트 레이블을 변경합니다 슬립 호출 label.setText ("세 번째 텍스트") 처음 4secs 기다린 후 세 번째 텍스트

 @Override 
     public void actionPerformed(ActionEvent e) { 
      label.setText("second text"); 
      new Thread(){ 
       public void run(){ 
       try { 
        //Thread.currentThread(); 
        Thread.sleep(4000); 
        label.setText("third text"); 
       } catch (InterruptedException exc) { 
       System.out.println("Erorrrrr"); 
      } 
      } 
     }.start(); 

     } 
+0

고맙습니다. 빠른 응답과 설명적인 대답 !!! – user1990198

+0

ur welcome 감사합니다. –

+0

label.setText ("세 번째 텍스트")를 실행하기 위해 invokeLater를 사용하거나 EDT 외부의 GUI를 수정해야합니다. –

0

GUI는 스레드에서 실행됩니다. x 초 동안 해당 스레드를 잠자기하면 GUI가 x 초 동안 정지합니다. 마르코에 의해 코멘트에서 언급 한 바와 같이

는, 텍스트 속성의 변화는 결과를 확인하기 위해 수행 할 수있는 유일한 일이 아니다

2

"대신 javax.swing.Timer와 지연 이벤트를 예약해야한다" Java의 내부를 고려할 때. 또한 컨트롤을 다시 그려야합니다 (무효화 될 수 있음).

잠자기를 호출하면 실제로 변경 한 컨트롤을 다시 그리는 Java GUI 내부 작업자가 중지됩니다. 수면이 끝난 후에 만 ​​일어날 수 있습니다.

0

Event Dispatch Thread (GUI 이벤트를 처리하는 스레드)에서 잠을 자면 GUI가 멈 춥니 다. 액션 리스너와 자고있는 백그라운드 스레드를 시작할 수 있습니다.

당신이 actionPerformed 메소드는 새 스레드를 열 경우에 따라서는 후 다음 주 GUI 스레드를 발표 할 예정 : 변경 사항이 발생하는 주요 GUI 스레드를 해제하는 데 필요한 작업을 수행하는 방법에

public void actionPerformed(ActionEvent e) 
{ 
    label.setText("text 1"); 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      try { 
       Thread.sleep(1000); 
      }catch (InterruptedException ignore){} 

      // queue Swing code for execution on the EDT 
      EventQueue.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        label.setText("text2"); 
       } 
      }); 
     } 
    }).start(); 
}
관련 문제