2014-12-26 2 views
0

저는 작은 게임을 만들고 있으며 게임을 저장하는 저장 기능을 이미 구현했습니다 (새 XML 파일에 정보를 작성하여). 저축은 몇 초가 걸리므로 다음과 같이하고 싶습니다 : 프로그램이 게임을 저장하는 동안 JPanel의 모양을 바꾸고 싶습니다. 저장이 끝나면 다른 페이지로 돌아가고 싶습니다 (쇼 또 다른 JPanel). 나는 다음과 같은 코드가 있습니다 게임이 저장되고 사용자가 다시 teampage로 이동합니다,하지만 패널이 변경되지 않습니다 것입니다 어떻게됩니까Java : 게임을 저장하는 중 JPanel을 변경하십시오.

confirm.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      String fileNaam = saveGame.getText(); 
      //This method changes the look of the panel 
      changePanel(); 
      //This method saves the game 
      model.saveGame(fileNaam); 
      //This method takes the user back to a previous page 
      controller.viewTeamPage(); 
     } 
}); 

합니다. changePanel() 메서드가 작동하기 때문에 문제는 아니지만 결코 실행되지 않는 것처럼 보입니다. 누군가가 어떻게이 문제를 해결할 수 있는지 궁금합니다.

편집 :

private void changePanel() { 
    panel.removeAll(); 
    panel.repaint(); 
    panel.revalidate(); 
} 

이 지금은 그냥 간단하게하기 위해 패널에 모든 것을 제거하기위한 패널의 모양을 변경할 수있는 방법입니다. 또한 저장은 별도의 스레드에서 수행되지 않습니다.

EDIT 2 : 게임을 저장하기 위해 스레드를 사용하여 수정하고 저장이 끝난 후 팀으로 돌아갑니다. 아래 코드를 참조하십시오.

같은 패널을 변경하고 새로운 패널을 intializing하지 않는 경우
confirm.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      final String fileNaam = saveGame.getText(); 
      changePanel(); 
      Thread t = new Thread (new Runnable() { 
       @Override 
       public void run() { 
        model.saveGame(fileNaam); 
        controller.viewTeamPage(); 
       } 
      }); 
      t.start(); 
     } 
}); 
+1

changePanel 메서드를 호출하는 방식이 아닌 자체를 표시해야합니다. – laune

+0

절약에 몇 초가 걸렸으니 실제로 저장을 별도의 스레드에서 수행합니까? –

+0

changePanel() 메서드를 추가했습니다. – casper04

답변

0
  1. 새 스레드에서 게임 메서드를 저장하지만이 스레드가 메서드 actionPerformed() 내부에서 완료 될 때까지 "참가"또는 "시도"하지 마십시오.
  2. 세이브 게임 스레드가 게임을 저장 한 후에 controller.viewTeamPage()을 호출하십시오. 한 가지 간단한 방법은 "컨트롤러"개체를 사용자 지정 스레드의 생성자에 전달하여 게임을 저장 한 후에 해당 호출을 할 수 있도록하는 것입니다.

actionPerformed() 메서드에서 만든 모든 호출이 UI 스레드에서 만들어지고 메서드가 반환 될 때까지 전체 UI가 새로 고쳐지지 않으므로 1 단계는 매우 중요합니다. 심지어 repaint()을 호출해도 에있는 것만으로는 충분하지 않습니다. actionPerformed()이 반환 된 후에 만 ​​발생하는 패널의 새로 고침을 "예약"하기 때문에 충분하지 않습니다. 그러나 시간이 많이 걸리는 호출을 별도의 스레드에 넣으면 actionPerformed()이 반환되어 신속하게 UI가 새로 고쳐지며 게임 저장 스레드가 작업을 수행합니다.

+0

고마워, 고쳐 줬어. 나는 그것이 당신이 의미했던 것과 정확히 일치하는지 모르겠지만 작동합니다. – casper04

1

는 내가 생각하는 문제는 내가 생각하는 panel.revalidate 또는 panel.repaint를 호출 할 필요가 있다는 것입니다. 절차 생성 프로젝트를위한 데모를 만들었고 패널을 변경하기 위해이 작업을 수행해야했습니다.

관련 문제