我很难开始一个新的会议。当我使用菜单选项新游戏时,我得到一个新实例 - 当真的,我只想用新的实例替换当前实例。我尝试了很多不同的东西,仍然无法解决它......
这是我的代码:
package tictactoe;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TicTacToe2 extends JFrame implements ActionListener {
char[][] game = new char[3][3];
JButton[][] buttons = new JButton[3][3];
JButton menuItem = new JButton();
JMenu menu = new JMenu ("TicTacToe");
JMenuItem newgame = new JMenuItem("Start New Game"),
exit = new JMenuItem("Exit");
TicTacToe2()
{
super("Tic Tac Toe");
setSize(500, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setLayout( new BorderLayout());
JPanel northPanel= new JPanel();
northPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
add("North", northPanel);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(3,3, 4, 4));
add("Center", buttonPanel);
Font font = new Font("Serif", Font.BOLD, 32);
for (int row=0; row < game.length; row++)
{
for (int col =0; col < game[row].length; col++)
{
game[row][col] = ' ';
JButton b = new JButton(" ");
b.setFont(font);
b.setBackground(Color.green);
b.addActionListener(this);
buttons[row][col] = b;
buttonPanel.add(b);
}
}
menu.add(newgame);
menu.add(exit);
newgame.addActionListener(this);
exit.addActionListener(this);
JMenuBar bar = new JMenuBar( );
bar.add(menu);
setJMenuBar(bar);
}
public void actionPerformed(ActionEvent e) {
Object menusource = e.getSource();
if(menusource == newgame){
new TicTacToe2();
}else if(menusource == exit){
System.exit(0);
}
}
public static void main(String[] args) {
TicTacToe2 ttt = new TicTacToe2();
}
}
答案 0 :(得分:4)
每次进入“新游戏”菜单时,您都会创建一个新实例:
new TicTacToe2();
如果您只想重置实例,请编写一个reset()
方法,将游戏状态设置为初始状态。
答案 1 :(得分:2)
public void actionPerformed(ActionEvent e) {
Object menusource = e.getSource();
if(menusource == newgame){
new TicTacToe2(); //What are you doing with this object?
//Should really be resetGame();
}else if(menusource == exit){
System.exit(0);
}
}
可能是个问题..我怀疑这是你获得新帧实例的地方。 有一个方法可以将数组清除为默认值,重置分数,你应该好好去。
答案 2 :(得分:2)
而不是创建班级的新实例
new TicTacToe2();
单击“新游戏”菜单项时,您可以清除按钮阵列文本并准备新游戏:
for (int i=0; i < buttons.length; i++ ) {
for (int j=0; j < buttons[0].length; j++ ) {
buttons[i][j].setText(" ");
}
}
答案 3 :(得分:0)
如上所述,已经提到过您不必创建像
这样的新实例new TicTacToe2()
所以,我会从那里继续。你的if语句应该是
if (menusource == newgame) {
getContentPane.removeAll();
setContentPane(aFunc);
}
创建一个看起来像下面的函数,它设置布局并将组件添加到它。将绘图逻辑放在那里并将其作为setContent窗格的参数。例如
private JPanel aFunc() {
custSelectPanel.setLayout(null);
customerTable.setDragEnabled(false);
customerTable.setFillsViewportHeight(true);
......
cancelButton.setLocation(350, 0);
cancelButton.setSize(100, 40);
buttonPanel.add(cancelButton);
return custSelectPanel;
}
我希望你在这里获得逻辑