2015-02-23 8 views
0

Я делаю Pong на Java, и я уже реализовал основную игру, но я также хочу, чтобы экран меню всплывал в начале. Я создал экран меню, но я не могу понять, как начать игру, когда я нажимаю кнопку «начать игру». У меня есть класс, который содержит мой основной метод:Невозможно создать новый 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() и очистите или удаляю меню JPanel внутри моего JFrame и заменим его на JPanel из моего игрового класса. Вот список действий из класса меню:

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

ответ

0

Не создавайте новый PongRunner в своем прослушивателе действий. Используйте первоначально созданный экземпляр.

Кроме того, не используйте add с вашим JFrame использовать метод setContentPane установить основной содержание кадра. Таким образом, вам нужны PongRunner и Menu, которые должны быть подклассами Container, которые каждый качающийся JComponent).

Поэтому код должен быть как:

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

+0

Право, исправлено –

Смежные вопросы