メイン クラス Frame のコードは次のとおりです。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Frame extends JFrame {
static OnePlayer onePlayer;
static TwoPlayer twoPlayer;
static Frame f;
static JButton BOnePlayer = new JButton("Single Player");
static JButton BTwoPlayer = new JButton("Multiplayer");
static JButton BInstructions = new JButton("Instructions");
static JButton toMenu;
static JButton replay;
public Frame(String name) {
super(name);
this.setTitle(name);
this.setVisible(true);
this.setSize(640, 673);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setBackground(Color.GRAY);
BOnePlayer.setBounds(120, 150, 400, 100);
BTwoPlayer.setBounds(120, 250, 400, 100);
BInstructions.setBounds(120, 350, 400, 100);
BOnePlayer.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
BTwoPlayer.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
BInstructions.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
BOnePlayer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Container onePane = f.getContentPane();
onePane.setLayout(new GridLayout(1, 1));
onePlayer = new OnePlayer();
onePane.add(onePlayer);
onePlayer.init();
f.remove(BOnePlayer);
f.remove(BTwoPlayer);
f.remove(BInstructions);
}
});
BTwoPlayer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Container twoPane = f.getContentPane();
twoPane.setLayout(new GridLayout(1, 1));
twoPlayer = new TwoPlayer();
twoPane.add(twoPlayer);
twoPlayer.init();
f.remove(BOnePlayer);
f.remove(BTwoPlayer);
f.remove(BInstructions);
}
});
BInstructions.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
}
public static void main(String[] args) {
f = new Frame("Snake");
drawMenu();
}
public static void OnePlayerDone(int score) {
}
public static void TwoPlayerDone(int winner, int p1score, int p2score) {
f.remove(twoPlayer);
replay = new JButton("Play Again");
toMenu = new JButton("Return to Menu");
replay.setBounds(120, 100, 400, 100);
toMenu.setBounds(120, 500, 400, 100);
replay.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
toMenu.setFont(new Font("Comic Snas MS", Font.ITALIC, 20));
f.add(replay);
f.add(toMenu);
replay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Container twoPane = f.getContentPane();
twoPane.setLayout(new GridLayout(1, 1));
twoPlayer = new TwoPlayer();
twoPane.add(twoPlayer);
twoPlayer.init();
}
});
toMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
drawMenu();
}
});
}
public static void drawMenu() {
f.add(BOnePlayer);
f.add(BTwoPlayer);
f.add(BInstructions);
}
}
提案:
- まず、クラスの名前を 以外の名前に変更します
Frame
。これは、密接に関連するコア Java クラスの名前であり、JFrame に相当する AWT です。同じ名前を付けると、多くの人が混乱する可能性があります。おそらくそれを呼び出しますSnakeFrame
。
- 代わりに、すべての静的変数をインスタンス変数にする必要があります。
- SnakeFrame 変数 (変数 f) さえ持つべきではありません。代わりに、現在の SnakeFrame インスタンスを使用する必要があります
this
。
- AWT と Swing コンポーネントを不必要かつ必要なく混在させないでください。たとえば、Canvas 派生オブジェクトではなく、JPanel 派生オブジェクトを使用する必要があります。
- コードは、他の人 (たとえば私たち) が理解できるように、Java 命名規則に従う必要があります。変数名とメソッド名はすべて小文字で始める必要があります。
- null レイアウトや
setBounds(...)
.
- 最も重要なのは、やろうとしているときにビューを交換するには、この目的のために構築された CardLayout を読んで使用することです。