2013-12-21 3 views
0

다른 버튼 영역을 입력 할 때 내 앱이 다른 소리를 재생합니다. 마우스가 버튼 영역을 빠져 나오면 모든 소리가 멈추기를 바란다. 나는 mouseEntered 방법에 소리를 시작하고 mouseExited 방법에 그들을 막을 :마우스를 멈추게 할 때 마우스가 요소를 벗어날 때 실행 JFrame

@Override 
public void mouseEntered(MouseEvent mouse) { 
    allForms.playSounds(mouse); 
} 

@Override 
public void mouseExited(MouseEvent mouse) { 
    allForms.stopSounds(mouse); 
} 

문제가 mouseExited을 실행하기 시작하는 중간에 실행의 중단하지 않습니다 mouseEntered 방법이다.

이 문제를 해결할 방법이 있습니까?

답변

2

스레드를 묶어서 Swing 이벤트 스레드에서 코드가 오래 실행되는 것 같습니다. 해결 방법은 배경 스레드에서 playSounds를 호출하여 스윙 스레드를 풀어서 응답하고 사용자가 stopSounds를 호출 할 수있게하는 것입니다. SwingWorker는 백그라운드 스레드를 만들고 스레드 안전 모드에서 코드가 스윙과 상호 작용하도록 도와줍니다.

다른 방법으로 코드를 트리거하는 또 다른 방법은 JButton의 ButtonModel에서 롤오버 이벤트를 수신하는 것입니다.


편집 주석의
당신의 상태 :

는 클래스를 확장 할 필요없이 SwingWorker를 사용할 수 있습니까? 내 클래스는 이미 JFrame을 확장합니다.

  • 귀하의 SwingWorker의는 자신의 클래스에있을 수도 있고, 충분히 작은 있다면 익명의 내부 클래스가 될 수 있습니다. 코드를 M-V-C 패턴 (또는 Model-View-Control)에 포함 시켰다고 가정하고, 별도로 작성하면 "제어"코드의 일부가됩니다.
  • JFrame과 같은 최상위 창을 확장하는 GUI 코드를 작성하는 경우가 거의 없으며이를 피하면 문제와 좌절에서 나를 구할 수 있습니다.
+0

클래스를 확장하지 않고도 SwingWorker를 사용할 수 있습니까? 내 클래스는 이미 JFrame을 확장합니다. – user3058906

+0

@ user3058906 : 답장 수정을 참조하십시오. –

관련 문제