2015-02-23 58 views
0

我在Java中使用Pong,並且我已經實現了主遊戲,但是我也想在開始時彈出一個菜單屏幕。我創建了菜單屏幕,但是當我按下「開始遊戲」按鈕時,我無法弄清楚如何開始遊戲。我有一個包含我的主要方法的類:不能創建一個新的JPanel

public class main { 
    public static void main(String[]args) 
    { 
     PongRunner runner = new PongRunner(); 
     runner.menuScreen(); 


     //System.out.println(""+display.getHeight()+" "+display.getWidth()); 

    } 

} 

而且我也有一個類用於運行菜單和主遊戲:

import javax.swing.JFrame; 


public class PongRunner extends JFrame{ 
    JFrame frame = new JFrame("MLG Pong"); 
    public PongRunner() 
    { 

    } 

    public void menuScreen() 
    { 
     Menu menu = new Menu(); 
     frame.add(menu); 
     frame.setSize(1280,720); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
    } 

    public void startGame() 
    { 
     frame.removeAll(); 
     game game = new game(); 
     frame.add(game); 
    } 

} 

我想使它所以當我按下按鈕啓動遊戲,我將調用startGame()方法並清除或刪除JFrame中的菜單JPanel,並將其替換爲我的遊戲類中的JPanel。以下是菜單類中的actionListener:

public void actionPerformed(ActionEvent e) 
    { 
     if(e.getActionCommand().equals("startgame")){ 
      redraw = false; 
      //System.out.println("test"); 
      PongRunner runner = new PongRunner(); 
      runner.startGame(); 
     } 
    } 

有關如何操作的任何想法?

+1

退房CardLayout - 它會讓你在一次顯示一個JPanel並在它們之間進行切換。以下是教程:http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html。 – Amber 2015-02-23 18:49:02

回答

0

請勿在動作偵聽器中創建新的PongRunner。使用最初創建的實例。

另外,不要使用addJFrame使用方法setContentPane設置主要內容框架。所以你需要PongRunnerMenu是每個揮杆JComponent的Container的子類。

因此,代碼應該是這樣的:

public class main { 
    public static void main(String[]args) { 
    PongRunner runner = new PongRunner(); 
    runner.menuScreen(); 
    } 
} 

public class game extends ... { // should extends at least Container 
} 

public class Menu extends JPanel implements ActionListener { 
    private PongRunner theRunner; 
    public Menu(PongRunner p) { 
    theRunner = p; 
    JButton b = new JButton("Start"); 
    b.setActionCommand("startgame"); 
    this.add(b); 
    b.addActionListener(this); 
    } 
    public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("startgame")) { 
     theRunner.startGame(); 
    } 
    } 
} 

public class PongRunner extends JFrame { 
    JFrame frame = new JFrame("MLG Pong"); 
    public void menuScreen() { 
    Menu menu = new Menu(this); 
    frame.setContentPane(menu); 
    frame.setSize(1280,720); // don't use such a thing, set the preferred size of the contentPane to a desired value 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    } 
    public void startGame() { 
    frame.setContentPane(new game()); 
    frame.pack(); 
    }  
} 
+0

在menuScreen方法中創建一個新菜單時,是否應該有一個'(this)'作爲參數,因爲Menu構造函數將PongRunner作爲參數? – daltonv297 2015-02-24 01:14:15

+0

正確,更正 – 2015-02-24 07:31:10