2012-09-17 7 views
3

나는 게임을 만들려고 노력하고 있습니다. 게임에는 메인 메뉴와 실제 게임 화면과 같은 여러 화면이 있습니다. 이들 각각은 별도의 jpanel 확장입니다. 저는 Game이라는 클래스 인 JFrame에 각각을 추가했습니다. 내 게임 클래스에서 나는JPanels 간 전환

public void addPanel(JPanel p) { 
    panels.add(p); // An array of all the different panels I need 
    this.getContentPane().add(p); 
} 

public void switchToPanel(JPanel p) { 
    for (JPanel somePanel : panels) { 
     somePanel.setVisible(false); 
    } 

    p.setVisible(true); 
    repaint(); 
} 

이의 요점은 내가 여러 가지 패널이 나는 등의 메뉴 화면으로 특정 하나를 보여줄 필요가있을 때, 나는 switchToPanel (myPanel)를 호출하는 것입니다 다음과 같은 방법이있다. 기본적으로 모든 패널을 숨기고보아야 할 패널을 숨 깁니다. 문제는 내가 전환 할 때 이러한 패널이 나타나지 않는다는 것입니다. 그 중 유일하게 나타나는 것은 내가 마지막에 추가 한 패널입니다. 목표 C에서는 항상 뷰를 전환하는 데이 기술을 사용하며 전혀 문제가 없었습니다. 이런 종류의 것이 자바에서는 허용되지 않습니까?

편집 : 지금은 전환 한 후 다시 그리기()를 호출하고,하지만 여전히 당신은 동일한 효과를 달성하기 위해 서로 다른 여러 가지 작업을 수행 할 수 있습니다

+0

havent가 잠시 동안 만져 봤지만 프레임을 다시보고 싶으면 프레임을 그리거나 다시 칠할 필요가 있다고 생각합니다. –

+1

또한 cardLayout을 참조하십시오 –

답변

8

을 작동하지 않습니다.

첫 번째 제안은 CardLayout (How to Use CardLayout)입니다. 이것이 의도 한대로 사용하십시오.

다른 하나는 JTabbedPane (How to use Tabbed Panes)

+0

예 저는 cardLayout이 갈 길이라고 생각했습니다. –

+0

@SeanF 그것은 당신이 원하는 것을하기 위해 고안된 것입니다. 왜 바퀴를 다시 만들어야합니까? (지금은 게으름입니다.) – MadProgrammer

+0

나는 실제로 그것을 알아 냈습니다. 어떤 이유로 jpanel을 추가 할 때마다 pack()을 호출해야합니다. 내 프레임. 나는 그것들을 모두 추가 할 수없고 pack()을 호출 할 수 없다. 각 패널이 추가 된 후에 한 번 호출해야한다. 기묘한! –

1

당신이 게임을하는 경우, 당신은 그것이 EDT 다른 별도의 스레드에서 만들어 사용하는 것입니다. 대부분의 게임은 패널을 변경하지 않고 다른 화면을 표시하지만 그들은 하나의 패널을 사용합니다.이 패널은 GameState에 따라 렌더링됩니다.

다음은 예입니다.

public class MyGame extends JPanel implements Runnable { 

    public static enum GameState { 
     MENU, INTRO, LEVELS, END, TITLES 
    } 

    GameState state = GameState.MENU; 

    public MyGame(){ 
     setDoubleBuffered(true); 
     // Initialize the resources 
     new Thread(this).start(); 
    } 

    public void update(long elapsedTime){ 
     switch (state){ 
      case MENU: 
       // Show the menu 
       break; 
      .... 
     } 
    } 

    private void GameLoop(){ 
     // Game Loop goes here 
    } 

    public void run(){ 
     GameLoop(); 
    } 

    public void paint(Graphics g){ 
     // switch and draw your game 
    } 

    public static void main(String[] args){ 
     JFrame f = new JFrame("MyGame"); 
     f.setSize(640, 480); 
     f.add(new MyGame()); 
     f.setVisible(true); 
    } 

} 하나 개의 상태 즉., 메뉴가 완료되면

state 변수를 변경합니다. 그리고 직접 작성하기 전에 GameEngine을 사용하여 배우십시오.

1

두 패널을 전환하려면 해당 패널을 다른 JPanel에 추가하고 cardLayout을 사용하십시오. 그런 다음 JPanel을 추가하기 전에 현재의 것을 제거하십시오. 이와 같이 :

parentPanel.removeAll(); 
parentPanel.repaint(); 
parentPanel.revalidate(); 

parentPanel.add(childPanel1); 
parentPanel.repaint(); 
parentPanel.revalidate(); 

마찬가지로 다른 하위 패널에 대해서도 동일한 작업을 수행하십시오.