2017-10-22 238 views
1

所以,我試圖爲一個簡單的遊戲製作一個基本的功能菜單。我試圖通過創建2個JPanels,一個用於實際遊戲,另一個用於我的菜單來實現。如何在面板內切換JFrame中的JPanel?

我想要做的是在我的菜單面板上有一個按鈕,當按下時,將JPanel從菜單的JFrame中顯示到實際遊戲的JPanel。

這裏是我的代碼:

class Menu extends JPanel 
{ 
    public Menu() 
    { 
     JButton startButton = new JButton("Start!"); 
     startButton.addActionListener(new Listener()); 
     add(startButton); 
    } 

    private class Listener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     {  
     Container container = getParent(); 
     Container previous = container; 
     System.out.println(getParent()); 
     while (container != null) 
     { 
      previous = container; 
      container = container.getParent(); 
     } 
     previous.setContentPane(new GamePanel());  
     } 
    } 
} 

正如你所看到的,我創建了一個監聽我的啓動按鈕。在偵聽器內部,我使用了一個while循環通過getParent()方法到達JFrame。該程序獲取JFrame對象,但它不讓我打電話setContentPane方法...

有誰知道如何得到這個工作,或更好的方式之間來回切換菜單和遊戲?

+1

'更好的方式來來回切換菜單和遊戲之間的' - 使用[卡布局(https://docs.oracle.com/javase/tutorial /uiswing/layout/card.html),用於在同一個容器中交換面板。 – camickr

+1

不要承擔容器層次結構。使用觀察者模式,並從小組發送通知給觀察員,他能夠更好地確定應該完成的工作 – MadProgrammer

回答

2

像這樣:

public class CardLayoutDemo extends JFrame { 

    public final String YELLOW_PAGE = "yellow page"; 
    public final String RED_PAGE = "red page"; 
    private CardLayout cLayout; 
    private JPanel mainPane; 
    boolean isRedPaneVisible; 

    public CardLayoutDemo(){ 

     setTitle("Card Layout Demo"); 
     setSize(400,250); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     mainPane = new JPanel(); 
     cLayout = new CardLayout(); 
     mainPane.setLayout(cLayout); 

     JPanel yellowPane = new JPanel(); 
     yellowPane.setBackground(Color.YELLOW); 
     JPanel redPane = new JPanel(); 
     redPane.setBackground(Color.RED); 

     mainPane.add(YELLOW_PAGE, yellowPane); 
     mainPane.add(RED_PAGE, redPane); 
     showRedPane(); 

     JButton button = new JButton("Switch Panes"); 
     button.addActionListener(e -> switchPanes()); 

     setLayout(new BorderLayout()); 
     add(mainPane,BorderLayout.CENTER); 
     add(button,BorderLayout.SOUTH); 
     setVisible(true); 
    } 

    void switchPanes() { 

     if (isRedPaneVisible) {showYelloPane();} 
     else { showRedPane();} 
    } 

    void showRedPane() { 
     cLayout.show(mainPane, RED_PAGE); 
     isRedPaneVisible = true; 
    } 

    void showYelloPane() { 
     cLayout.show(mainPane, YELLOW_PAGE); 
     isRedPaneVisible = false; 
    } 

    public static void main(String[] args) { 
     new CardLayoutDemo(); 
    } 
} 
+0

我認爲這個(被刪除的評論)需要另一個問題/帖子,最好用[mcve]。 'JPanels'不必與父母在同一個班上。共享屬性有許多選擇,包括getter和setter。 – c0der

+0

我刪除了評論,因爲我意識到這很愚蠢......但有一件事,如果我想要在主菜單上的按鈕切換到其他窗格,並從另一個窗口切換回主菜單,我將如何使用卡片佈局事件發生時的窗格? (例如,你在遊戲中死亡)意思是,沒有按鈕總是在那裏 –

+0

'我將如何使用卡片佈局... - - 這就是爲什麼你閱讀你給的教程鏈接。然後,當您遇到問題時,您可以嘗試發佈帖子和發佈代碼。努力工作,不要指望人們爲你提供餵食代碼。 – camickr