2017-10-22 20 views
1

私は単純なゲームの基本的な機能メニューを作ろうとしています。私は2つのJPanelを作成して、実際のゲーム用と私のメニュー用の2つのJPanelを作成しようとしました。JFrame内の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());  
     } 
    } 
} 

が、私は私のスタートボタンのリスナーを作成しました:

は、ここに私のコードです。リスナーの内部では、getParent()メソッドを使用してJFrameにアクセスするためにwhileループを使用しました。プログラムは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

これは(削除されたコメント)が別の質問/投稿を必要とすると思います。 'JPanels'は親クラスと同じクラスにある必要はありません。ゲッターやセッターなど、プロパティを共有するための多くの選択肢があります。 – c0der

+0

どのように愚かなのか気づいたのでコメントを削除しました...しかし、メインメニューのボタンを他のペインに切り替え、もう一方のメニューからメインメニューに戻すには、どうすればカードレイアウトを使いますか?イベントが発生したときのペイン? (例えば、あなたはゲームで死んでいる)意味は、ボタンがいつもそこにあるのではない –

+0

'私はカードレイアウトをどうすれば使うだろう? ' - あなたが与えたチュートリアルのリンクを読んでいる理由です。その後、問題が発生したときにあなたの投稿とポストコードを試してみましょう。努力して、人々があなたのためにフィードコードをスプーンすることを期待しないでください。 – camickr

関連する問題