2014-06-18 7 views
0

스윙에 setScreen(int stage)이라는 일부 버튼을 숨기고 표시하는 메서드가 있습니다.이 메서드는 stage 매개 변수에 따라 특정 버튼을 숨기거나 나타내지 않습니다.스윙 작업을 즉각적으로 만들기

void setScreen(int stage) { 
    switch (stage) { 
     case WELCOME: 
      screen.infoLabel.setText("Welcome!"); 
      screen.startButton.setVisible(true); 
      break; 

     case STAGE_TWO: 
      screen.infoLabel.setText("We are in stage two!"); 
      screen.startButton.setVisible(false); 
      break; 
    } 

    screen.validate(); 
} 

화면은 다음과 같습니다

... //Here stage has been assigned to some value 

setScreen(stage); 

if (stage != STAGE_TWO) { 
    sleep(WAIT_TIME * 1000); 
    stage = WELCOME; 
    setScreen(stage); 
} 

setScreen(int stage)에 대한 코드는 다음과 같은 것입니다 : 나는 다음 메소드를 호출 몇 초를 기다린 후이 코드에서처럼, 다시 호출 할 JFrame을 확장하는 클래스의 인스턴스화.

여기서 문제는 변경 내용이 커밋되기 전에 스레드가 절전 모드로 전환되기 때문에 첫 번째 setScreen(stage)이 표시되지 않는다는 것입니다. 시스템의 시간을 확인하는 동안 잠을 대신 사용하려고했지만 효과는 같습니다.

** 편집 : ** 나는 유용한 StackOverflow 스레드에서 Swing Timer에 대한 유용한 정보를 발견했습니다. 나는 그것으로 일하고 내가하는 모든 유용한 진보를 업로드 할 것이다.

+0

스윙 타이머 또는 SwingUtils.invokeLater 호출 –

+1

네 당 전체 타이머 수 있습니다합니다. 아마 당신이 여기에 필요한 것을 다뤘습니다 : http://stackoverflow.com/questions/24270226 –

답변

1

잠자기 이벤트 발송 스레드입니다. 그것을 사용하지 마십시오

javax.swing.Timer timer = new javax.swing.Timer(WAIT_TIME * 1000, new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     if (stage != STAGE_TWO) { 
      stage = WELCOME; 
      setScreen(stage); 
     } 
    } 
}); 
timer.start(); 

을 조건은 귀하의 요구 사항

+0

예, 제가 구현 한 솔루션은 이것과 매우 유사합니다. 고맙습니다. – user2891462