JMenu 当被点击时创建一个新游戏

JMenu when is clicked create a new Game

我有一个主要 class 负责框架和 JMenu,另一个 class 用于从 JPanel 扩展的游戏。当单击 jMenu 中的一个选项时如何创建一个新游戏?

目前,我有这个

class Application {

    private static Game game;
    private static TheFrame frame;
    private static JMenuBar menu;

    public Application(){
        frame = new TheFrame();
        menu = new JMenuBar();
        JMenu file = new JMenu("File");
        menu.add(file);
        frame.setJMenuBar(menu);
        JMenuItem newGame = new JMenuItem("New Game");
        newGame.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                newGame();
            }
        });
        file.add(newGame);
        JMenuItem scores = new JMenuItem("Show Scores");
        scores.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                new Score();
            }
        });
        file.add(scores);
        JMenuItem exit = new JMenuItem("Exit!");
        exit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        file.add(exit);
    }

    private void newGame(){
//      frame.getContentPane().removeAll();
        frame.getContentPane().setBackground(Color.pink);
        game = new Game();
        frame.addGameToCanvas(game);
        game.runMenu();
    }

    /**
     * Main method
     * @param args
     */
    public static void main(String args[]) {
        Application app = new Application();
    }
}

但是当我点击新游戏时,框架变黑并且不显示任何内容。我之前在命令行上使用过,并且一切正常,但是当我尝试使用菜单执行此操作时,它不起作用。有什么建议吗?

编辑

frame.addGametoCanva() 的代码。它的作用是将游戏对象添加到 canvas。 public void addGameToCanvas(游戏 g){ canvas = g; 添加(canvas,BorderLayout.CENTER); 无效(); 证实(); 重绘(); }

是的,游戏对象有一个有限循环,用于用户输入(来自控制台)

the game object, have a finite loop, for the user inputs (from console)

Event-Dispatch 线程 (EDT) 是单线程的 - 它负责绘制、事件处理等...如果试图在此线程上执行较长的 运行 任务,例如等待来自不同来源(如控制台)的用户输入,EDT 可能会锁定(换句话说,无响应 UI)。

任何长 运行 任务都应该放在它自己的 Thread or ran via a SwingWorker. Further, most calls on a non-EDT thread should be dispatched to the EDT using SwingUtilities.invokeLaterSwingUtilities.invokeAndWait 中(这包括 UI 的构造 - 注意main 方法在非 EDT 线程上运行)。

不过,我不完全确定为什么混合使用 UI(例如 Console Swing)- 您可以考虑只选择一个 UI.