2014-04-22 6 views
1

마우스 이벤트에서 true/false 테스트가 있고 false의 경우 간단한 애니메이션이 발생한다는 이벤트를 만들고 싶습니다. 애니메이션이 아니라 애니메이션 자체.GRect move가 보이지 않음

"miss", "dx"및 "dy"를 인스턴스 변수로 정의했습니다.

public void mousePressed(MouseEvent e) { 
    swingSword(); 
    determineHit(); 
    if (determineHit()){ 
     GRect test = new GRect(testX, testY, BRICK_WIDTH, BRICK_HEIGHT); 
     test.setFilled(true); 
     test.setFillColor(Color.GREEN); 
     add(test); 
     testX += 30; 
    } 
    else { 
     GRect test = new GRect(testX, testY, BRICK_WIDTH, BRICK_HEIGHT); 
     test.setFilled(true); 
     test.setFillColor(Color.RED); 
     add(test); 
     testX += 30; 

     miss = new GRect(200, 200, BRICK_WIDTH, BRICK_HEIGHT); 
     miss.setFilled(true); 
     miss.setFillColor(Color.RED); 
     add(miss); 
     for (int i = 0; i < 10; i++){ 
      miss.move(dx, dy); 
      pause(200); 
     } 

    } 
} 
+0

아 ACM, 내가 자바를 배울를 unlearning 전에 배워야했다 무엇을 : 그것은 당신이 대략은 다음과 같습니다 코드를 사용하여 for -loop를 대체 할 수 있다는 것을 의미한다. – arynaq

+0

이 코드의 잘못된 점은 무엇입니까? –

+0

GRect "miss"가 화면을 가로 질러 움직이는 것을 보지 못한다면, GRect는 전체 지연 카운트의 끝 부분에 나타납니다. – Luciano

답변

1

이벤트 발송 스레드를 차단하고 있습니다.

mousePressed 메서드를 실행하는 스레드는 에 대한 응답 스레드와 동일합니다. 따라서이 스레드가 for -loop을 처리하는 동안 (그리고 pause 메서드에서 대기 중임) 화면을 실제로 다시 칠할 기회가 없습니다.

주변 인프라에 따라 자체 스레드 또는 스윙 타이머로 해결할 수 있습니다.

final Timer timer = new Timer(200, null); 
timer.addActionListener(new ActionListener() 
{ 
    int counter = 0; 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     miss.move(dx, dy); 
     counter++; 
     if (counter >= 10) 
     { 
      timer.stop(); 
     } 
    } 
}); 
timer.start();