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

コンストラクターが呼び出されたときに false であるため、ブロック内のコードは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 に答える