2012-12-30 2 views
0

이동하고 크기를 조정하고자하는 JDialog을 만들었습니다. 내 프로그램에서 화면에 JDialog을 그립니다. 사용자가 클릭하면 화면 너비가 늘어나고 높이가 늘어납니다. 나는 이것을 이렇게 시도했다.JDialog에 애니메이션 적용

for(int i = 150; i <= width; i += 3) { 
    dialog.setSize(i, 80); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e2) {} 
} 

for(int i = 80; i <= 200; i++) { 
    dialog.setSize(width, i); 

    try { 
     Thread.sleep(1); 
    } catch(Exception e3) {} 
} 

코드를 실행하면 시간이 오래 걸리며 곧바로 JDialog가 표시됩니다. 확장되지 않습니다.

사용자가 대화 상자를 다시 클릭하면 시작 애니메이션이 취소되고 닫힙니다.

for(int i = 200; i >= 80; i--) { 
    newMsg.setSize(width, i); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e4) {} 
} 

for(int i = 0; i >= -width; i -= 3) { 
    newMsg.setLocation(i, 100); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e5) {} 
} 

제대로 작동합니다. 움직임을 볼 수 있습니다. 내가 이해하는 한,이 코드는 반대의 경우를 제외하고는 모두 동일합니다. 오프닝은 예상대로 작동하지 않지만 마감은 무엇입니까?

+0

를 사용해보십시오 루프 대신 타이머를 스윙하십시오. 나는 이벤트가 이벤트 큐에 걸려 있고 모든 이벤트를 한꺼번에 처리하고 있다고 생각한다. – DankMemes

+0

어떻게 할 수 있는지보고 싶습니다. 나는 Reimeus의 메시지에 대해 설명하고 ... – MikkoP

+0

가능한 중복 [단일 스레드에 sleep() 사용] (http://stackoverflow.com/questions/14074329/using-sleep-for-a-single-thread) –

답변

4

EDT에서 Thread.sleep으로 전화하지 마십시오. 이로 인해 UI가 "고정"됩니다. 대신 Swing Timer을 사용할 수 있습니다. 여기에 초기 처리 할 수 ​​있습니다 : "확장"어떻게

Timer timer = new Timer(0, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    updateDialogSize(); 
    } 
}); 

timer.setDelay(5); // short delay 
timer.start(); 

업데이트 대화 : 내가 훈련으로 대화 "수축"떠날거야

void updateDialogSize() { 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    if (dialog.getWidth() < screenSize.getWidth()) { // 1st size width 
     dialog.setSize(dialog.getWidth() + 5, dialog.getHeight()); 
    } else if (dialog.getHeight() < screenSize.getHeight()) { // then size height 
    dialog.setSize(dialog.getWidth(), dialog.getHeight() + 5); 
    } else { 
     timer.stop(); // work done 
    } 

    dialog.setLocationRelativeTo(myFrame); 
} 

)

+0

몇 가지 코드를 입력하십시오. 어떻게해야 할지를 알 수 없습니다. 나는 그것을 Timer로 처리하려고 시도했지만 꽤 이해하지 못했습니다 ... Timer 초기화 내에서 ActionListener를 정의하도록하는 여러 개의 타이머가 필요합니다. 그러면 Timer 초기화가 ActionListener 내부의 타이머를 중지시킬 수 없습니다. – MikkoP

+0

감사합니다. Reimeus! 이제는 예상대로 작동합니다. – MikkoP