【问题标题】:Cannot create a new JPanel无法创建新的 JPanel
【发布时间】:2015-04-25 03:41:30
【问题描述】:

我正在用 Java 制作 Pong,并且我已经实现了主游戏,但我还希望在开始时弹出一个菜单屏幕。我创建了菜单屏幕,但是当我按下“开始游戏”按钮时,我不知道如何开始游戏。我有一个包含我的主要方法的类:

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();
        }
    }

关于如何做到这一点的任何想法?

【问题讨论】:

标签: java swing jframe jpanel


【解决方案1】:

不要在你的动作监听器中创建一个新的PongRunner。使用最初创建的实例。

另外,不要将addJFrame 一起使用,使用setContentPane 方法设置框架的main 内容。所以你需要PongRunnerMenu 成为Container 的子类,每个swing 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();
  }    
}

【讨论】:

  • 在 menuScreen 方法中创建新菜单时,由于 Menu 构造函数将 PongRunner 作为参数,是否应该有 (this) 作为参数?
猜你喜欢
  • 2013-09-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2019-09-10
  • 2019-11-27
  • 2018-05-06
相关资源
最近更新 更多