2010-05-13 8 views
0

저는 자바 스윙 라이브러리를 사용하여 DAO라는 보드 게임을 개발하고 있습니다.JButton은 마우스 이벤트에서 즉시 바뀌지 않습니다.

인간 선수가 움직이기 시작한 후에 JButton을 연주하고자하는 피스 이미지와 함께 클릭하면 컴퓨터 AI 루틴을 호출하지만 마우스 이벤트 기능 안에서 문제가 발생합니다. 함수가 반환 될 때만 이렇게하면 컴퓨터가 차례대로 끝나고 JButton이 이미지를 새로 고칩니다 (setIcon이 제공됩니다).

JButton이 마우스 이벤트 기능이 종료 될 때뿐만 아니라 (마우스를 사용하여 데이터를 처리해야 할 때) 이미지가 변경되는 것을 어떻게 강제 할 수 있는지 알고 싶습니다.

나는이

    myButtons[i][j].setIcon(xIcon); 
        myButtons[i][j].revalidate(); 
        myButtons[i][j].repaint(); 
        myButtons[i][j].validate(); 

없음을 모두 해봤했다.

미리 Thumb in

+0

포스터가 이번에 실제로 답변을 수락 할 것인지 궁금해합니다. 지금까지 그의 다른 질문들에 대한 대답들 중 어느 것도 받아 들여지지 않았다. – camickr

답변

1

JButton을 클릭하면 수행되는 작업을 스윙 작업자에게 맡길 수도 있습니다. 이렇게하면 작업이 백그라운드에서 진행될 수 있지만 다른 버튼을 계속 클릭 할 수 있습니다.

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/simple.html을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. 지금 당장 시도하고 있습니다. 최선의 선택 인 것 같습니다 ... 작은 질문이 하나 있는데 .... 왜 doInBackground 함수에서 "반환 값이 누락되었습니다"라는 오류가 나옵니까? void 인 경우 void가 객체를 반환해야하므로 작동하지 않는 것 같습니다. SwingWorker myworker = new SwingWorker () {@Override protected Void doInBackground() {System.out.println ("ola"); }}; –

1

모든 스윙 활동에 단일 스레드가 사용됩니다.

다음은 과정입니다.

  • 하나의 이벤트는이이 큐에 배치됩니다 실행되는 동안이 현재까지 개최되는
  • 모든 새 이벤트가 생성 된 AWT 스레드에서 큐에서 가져온 및 실행
  • 이벤트 큐에 나타납니다 AWT 이벤트를 반환합니다.
  • 실행중인 이벤트는 리턴되고 큐의 다음 이벤트는 큐에서 제거되고 실행됩니다.

즉, 1/100 초 이상 걸리는 작업을 수행해야하는 경우 스윙 이벤트에서 시작된 스레드를 수행해서는 안됩니다. 대신 자신의 스레드를 생성하고 GUI를 업데이트 할 수 있도록 스윙 스레드를 시스템에 반환하십시오.

이제 스레드는 GUI 개체를 업데이트해서는 안됩니다. GUI 객체를 업데이트해야하는 경우 invokeLater를 사용하여 코드를 AWT 스레드에 다시 배치하십시오.

새로운 Java 프로그래머가이 규칙을 따르지 않고 AWT 스레드에서 작업을 실행하지 않으면 사람들은 Java가 느린 것으로 생각하는 가장 큰 이유입니다.

관련 문제