2013-02-19 3 views
2

네트워크로 연결된 게임 클라이언트를 작성 중이며 단추를 클릭 할 때 프레임 간을 변경할 때 문제가 있습니다.JFrame이 제대로로드되지 않았습니다.

클라이언트의 각 페이지를 다른 프레임으로 작성했으며 클라이언트의 홈 페이지에서 메뉴 단추를 클릭하면 해당 프레임이 표시되어야합니다. 다음

내가했던 코드 ..

public class homePage extends JFrame{ 
     public homePage() { 
     initComponents(); 
     } 

     private void initComponents(){ 
     // the frame and butttons are here.... 


     GameListBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      this.setVisible(false); // to hide the current home page 
      new GameList().start(); // to start new frame called GameList 
      // basically the same thing as following code 
      // GameList gl = new GameList(); 
      // gl.setVisible (true); 
      // gl.run(); 
     } 
     } 
} 

public class GameList extends JFrame{ 
     public GameList(){ 
     //Everything about the frame is here 
     } 

     // this method is for connection 
     public void run(){ 
      try{ 
       // open socket and initialize input streams, output streams here 

      while (true){ 
        //process data to and from server 
      } 
      }// end of try 
     } // end of run 

     // this method is to display GameList frame and it's connection 
     public static void start(){ 
     GameList frame = new GameList(); 
     frame.setVisible(true); 
     frame.run(); 
     } 

    } 

이 다음 클래스는 단지 GameList 프레임을 실행하고 main 메소드의 연결입니다입니다

public static void main(String[] args) { 
    new GameList().start(); 
    // basically the same thing as following code 
    // GameList gl = new GameList(); 
    // gl.setVisible (true); 
    // gl.run(); 
    } 

내 GameList 프레임은 main 메소드에서 실행했을 때 제대로 작동합니다. GUI가 표시되고 연결이 설정되어 데이터 전송에 성공한 것입니다. 기본적으로하고 싶은 것은 메인 메소드에서 호출 할 수있는 홈페이지의 ActionListener에서 새로운 GameList(). start() 메소드를 호출하고 GameList를 표시하고 홈페이지를 숨기는 것입니다.

첫 번째 코드에서 보았 듯이이 작업을 수행하면 GameList의 GUI가로드되지 않고 (검정색으로 바뀜) 연결이 설정되고 데이터 전송에 성공합니다. GUI는 연결이 종료 된 경우에만 표시됩니다. 그 이유는 GameList의 run() 메서드 내부에 while 루프가있는 것 같군요 ??

하지만 GameList 클래스의 main에서 실행하면 똑같은 기능이 매력처럼 작동합니다. 아무도 내가 gui가로드되지 않은 이유를 말해 줄 수 있습니까?

죄송합니다. 내 질문에 바보가 들리지만 도움을 주시면 대단히 감사하겠습니다.

+1

가능한 한 여러 프레임을 사용하지 마십시오. 사용자가 혼란스러워 화면에 혼란을 일으킬 수 있습니다. 가능한 경우,'CardLayout' 또는'JDesktopPane' 또는'JTabbedPane'을 대신 사용하십시오 – MadProgrammer

+0

예.당신이 몇 개의 게임을 던져서 얼마나 많은 게임을 던질 지 상상해보십시오. 너무 많이하지 않아도됩니다. –

+0

[여러 JFrame 사용, 좋음/나쁨 사용법] (http://stackoverflow.com/a/9554657/418556) –

답변

3

ActionListener에서 GameList.start()으로 전화하면 Swing EDT이됩니다. 즉, 스레드는 마우스 또는 키보드 입력과 같은 모든 이벤트를 스윙 프로세스로 처리하지만 구성 요소도 다시 칠합니다. Swing EDT에서 긴 프로세스를 수행 할 때 실제로 스레드를 차단하고 다른 이벤트를 처리하지 못하도록하고 그 중 다시 이벤트를 방지합니다. 이것이 프레임이 검정색이고 GUI가로드되지 않은 것입니다. 이것은 EDT 스레드가 아니기 때문에 메인 메소드에서 호출했을 때 발생하지 않았지만 애플리케이션의 메인 스레드였습니다.

이 문제를 해결하려면 Thread.start()Runnable을 사용하는 다른 스레드에서 GameList의 run() 메서드를 호출해야합니다.

엄지 손가락의 좋은 규칙은 응용 프로그램을 응답 성을 유지하기 위해 GUI 물건 및 플래그 이외의 이벤트를 넣지 말고 계산을하지 마십시오.

또 다른 규칙은 일반적으로 문제를 피하기 위해 프레임 생성을 포함하여 모든 GUI 항목을 스레드 EDT에 저장해야한다는 것입니다. 다른 스레드에서 작업해야하는 경우 (이벤트에 응답하지 않거나 기본 방법에있는 경우) SwingUtilities.invokeLater을 사용하십시오.

+0

알아보기 :) 건배 – Ken

관련 문제