2013-03-18 2 views
0

그래서 저는 GUI를 제외하고는 아주 잘 작동하는 작은 게임을하고 있습니다. 기본적으로, 버튼을 클릭 할 때 GUI를 수정해야합니다. 이 코드를 사용하여, 나는 그렇게 할 수있는 EDT에 내 코드를 실행해야 실현 :EDT on Swing (Dummies 용)

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     // some code 
    } 
}); 

난 그냥 지금 내 코드의 일부분이 우려되는하지 않습니다. GUI (클래스 생성자)를 생성하는 부분은 무엇입니까? 또는 내가 값을 수정하는 부분 만 (이 경우 Listener.actionPerformed())? 사실 나는 이것의 봇을 테스트했는데 둘 다 작동하지 않았습니다.

이제 버튼을 클릭하면 다음 코드를 수정하여 어떻게 수정합니까? 위의 코드에 그 일부를 포함해야합니까, 아니면 완전히 잘못 되었습니까?

package edttest; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class EDTtest { 
    public static void main(String[] args) { 
     GUI gui = new GUI(); 
    } 

    private static class GUI extends JFrame { 

     int x; 

     public GUI() { 
      x = 0; 
      setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      JButton button = new JButton (String.valueOf(x)); 
      button.addActionListener(new Listener()); 
      JLabel label = new JLabel (String.valueOf(x)); 
      add (label, BorderLayout.NORTH); 
      add (button); 
      pack(); 
      setVisible (true); 
     } 

     private class Listener implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       x++; 
       System.out.println (x); 
      } 
     } 
    } 
} 
+1

*이 *가 어떤 방법으로 업데이트 "어떻게 버튼을 업데이트하려면 다음 코드를 수정 않는다"는 Concurrency in Swing 자습서를 읽어 제안? –

+0

'private static class GUI는 JFrame을 확장합니다. {'1}'static'은 거의 도움이되지 않습니다. 2) 프레임을 확장하지 말고 하나의 인스턴스 만 사용하십시오. –

+0

@AndrewThompson 나는 그들 모두에게 당신의 조언에 동의하지 않습니다. – Mordechai

답변

2

EDT에서이 코드를 실행하는지 여부는 레이블에 아무런 영향을 미치지 않습니다. x을 증가시켜 레이블이 자체적으로 업데이트되기 때문이 아닙니다. 업데이트 된 값으로 label#setText으로 전화해야합니다.

EDT 관련 질문. Swing 구성 요소의 모든 액세스/수정/생성/...은 EDT에서 발생해야합니다. 즉, 메인 메소드의 내용을 SwingUtilities#invoke...에 랩핑해야합니다. UI를 통해 실행되는 모든 이벤트 (예 : 버튼 클릭)는 EDT에서 이미 처리됩니다. 따라서 청취자의 EDT에 Runnable을 명시 적으로 예약 할 필요가 없습니다.

의심스러운 경우 언제든지 EventQueue#isDispatchThread을 사용하여 EDT에 있는지 확인할 수 있습니다.

또한

+0

도움을 주셔서 감사합니다! 나는 ActionListener로부터 호출 된 EDT에'increment()'메소드를 작성했고, 전체 생성자를 감쌌다. 그게 문제를 해결했다. – azrael

관련 문제