2012-09-17 93 views
3

我正在嘗試製作遊戲。遊戲中有幾個不同的屏幕,例如主菜單和實際的遊戲屏幕。這些都是單獨的jpanel擴展。我已經將它們添加到我的JFrame中,這是一個名爲Game的類。在我的遊戲類,我有以下方法在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)。基本上只是隱藏每個面板,然後取消隱藏我需要看到的那個面板。唯一的問題是,當我切換到它們時,這些面板沒有顯示出來。唯一會出現的是我最後添加的面板。在Objective C中,我一直使用這種技術來切換視圖,而且我從來沒有遇到任何問題。這種事情在java中是不允許的嗎?

編輯:現在我打電話切換後重繪(),但它仍然沒有工作

+0

沒有觸及這些在一段時間,但我認爲你需要繪畫/重畫框架,如果你想看到它。 –

+1

也看cardLayout –

回答

8

你可以做許多不同的事情來達到同樣的效果。

我會做的第一個建議是使用CardLayoutHow to Use CardLayout),因爲這是它設計的目的。

另一個是使用一個JTabbedPaneHow to use Tabbed Panes

+0

是的,我認爲cardLayout是要走的路。 –

+0

@SeanF它的目的是做你想做的,爲什麼重新發明輪子(我現在懶惰的日子;)) – MadProgrammer

+0

我想出了實際上,出於某種原因,我不得不打電話pack()每次我添加一個jpanel我的框架。我不能只添加它們,然後調用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(); 

同樣地爲其他子面板做同樣的事情。