0

我正在尝试通过单击 JMenuItem 将 JPanel 添加到我的框架中。我查看了过去的帖子,并尝试使用:

getContentPane().add(myJPanel)
revalidate();
repaint();

无济于事。我的 Game 类现在只是一个具有大小设置和背景颜色的构造函数。哦,抱歉代码乱七八糟,我已经删除了我的非工作原件并迅速完成了这项工作,以了解我尝试过的内容。任何建议将不胜感激。

package game;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Main extends JFrame{

static boolean gameActive = false;
Game game;
JMenuBar menuBar;
JMenu file;
JMenuItem startGame;
JMenuItem checkScore;
JMenuItem closeGame;
int userScore;

public Main() {

    game = new Game();
    gameActive = false;

    //set JMenuBar
    menuBar = new JMenuBar();
    file = new JMenu("File");
    startGame = new JMenuItem("Start Game");
    checkScore = new JMenuItem("Check Score");
    closeGame = new JMenuItem("Close Game");
    menuBar.add(file);
    file.add(startGame);
    file.add(checkScore);
    file.add(closeGame);

    startGame.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            gameActive = true;
        }

    });

    if(gameActive == true){
        getContentPane().add(game);
        revalidate();
        repaint();
    }

    checkScore.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(checkScore, "your Score is " + userScore);

        }

    });

    closeGame.addActionListener(new ActionListener() {

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

    setJMenuBar(menuBar);

    //JFrame Properties
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 300);
    setLocationRelativeTo(null);
    setTitle("BattleGrounds");
    setResizable(false);
    setVisible(true);

}



   public static void main(String[] args){
       SwingUtilities.invokeLater(new Runnable(){
           public void run(){
                    new Main();
           }
       });
   }

 }
4

2 回答 2

2

将您的语句移动到您的内部,ActionListener而不是将它们放在构造函数中:

startGame.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        gameActive = true;
        add(game);
        revalidate();
        repaint();
    }
});

请注意,gameActive检查对于当前代码是多余的。也getContentPane().add(game)可以简单地写成add(game)

请注意,CardLayout是专门为管理此类功能而设计的。

于 2013-02-17T16:31:04.283 回答
0

块内的代码if将永远不会被执行,因为gameActive在调用构造函数时为假

 if(gameActive == true){
    getContentPane().add(game);
    revalidate();
    repaint();
}

单击时,您需要显示您的游戏活动startGame但是您必须检查是否已game添加到您contentPane的菜单中,因此当用户多次单击菜单时,它不会game每次都添加新实例

startGame.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
       gameActive = true;
       if(game == null) {
          game = new Game(); // remove the game creation from the constructor
          getContentPane().add(game);           
       }
    }

});
于 2013-02-17T16:32:50.460 回答