Java 在另一个类文件中重置JPanel
我在我的主类文件中创建了一个GUIJava 在另一个类文件中重置JPanel,java,swing,oop,constructor,jpanel,Java,Swing,Oop,Constructor,Jpanel,我在我的主类文件中创建了一个GUI import java.awt.*; import javax.swing.*; public class TicTac extends JFrame { TicTacEvent tictac = new TicTacEvent(this); JPanel row1 = new JPanel(); JButton[][] boxes = new JButton[4][4]; JButton play = new JButton("Play"); JButto
import java.awt.*;
import javax.swing.*;
public class TicTac extends JFrame {
TicTacEvent tictac = new TicTacEvent(this);
JPanel row1 = new JPanel();
JButton[][] boxes = new JButton[4][4];
JButton play = new JButton("Play");
JButton restart = new JButton("Restart");
JTextField blank1 = new JTextField();
JTextField blank2 = new JTextField();
JOptionPane win = new JOptionPane("Winner");
ImageIcon back = new ImageIcon("cardback.jpg");
public TicTac() {
super ("Tic Tac Toe");
setSize (800,650);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout layout = new FlowLayout();
setLayout(layout);
int name = 0;
String newname;
GridLayout layout1 = new GridLayout(5, 4, 10, 10);
row1.setLayout(layout1);
for (int x=0; x<=3; x++){
for (int y=0; y<=3; y++){
name = name + 1;
newname = Integer.toString(name);
boxes[x][y] = new JButton(newname);
boxes[x][y].setIcon(back);
row1.add(boxes[x][y]);
}
}
row1.add(blank1);
row1.add(play);
row1.add(blank2);
row1.add(restart);
add (row1);
play.addActionListener(tictac);
for (int x=0; x<=3; x++){
for (int y=0; y<=3; y++){
boxes[x][y].addActionListener(tictac);
}
}
setVisible(true);
}
public static void main(String[] arguments){
TicTac frame = new TicTac();
}
}
因此,假设每次调用restart()时,您都会认为我会创建另一个JPanel/GUI;方法,不是吗
我的OOP经验有限,所以我不知道从哪里开始,也不知道什么逻辑是错误的。谢谢。您不需要一次又一次地重新创建整个GUI。您需要做的是清除文本字段和用户迄今为止所做的任何选择。因此,您需要创建一个单独的方法,在该方法中,您将重置GUI中每个按钮/文本字段的状态 例如:要清除
textfield
,您将调用setText(“”)
方法
希望这会有所帮助。要重置游戏,只需将
单击重置为0,并将按钮恢复到创建时的原始状态:
boxes[x][y] = new JButton(newname);
boxes[x][y].setIcon(back);
除此之外,您的代码中还有许多问题需要解决。以下是一些:
- 您的行
框[x][y].addActionListener(tictac)
在它自己的循环中,它应该在初始循环中。没有理由在同一数组上迭代两次
- 您的布局决策可能会更好(具体取决于您想要得到什么)
- 使用
TicTac frame=new TicTac()启动GUI代码>从调用器
方法内部调用
- 为每个具有独特功能的按钮创建一个
ActionListener
。在您的情况下,1用于播放,1用于重新启动,1用于所有板按钮
- 您正在使用
event.getActionCommand
,但没有在任何按钮上调用setActionCommand
- 检查按钮是否按下(操作命令名称)时,不要使用多个
if
,使用if-else
,或者更好-使用开关
语句
- 不要对每个按钮使用单独的功能。使用1个函数,该函数接收按钮作为其参数
- 如果可以创建局部变量,则不要创建字段
如果您需要澄清,请留下评论
编辑:这里有一些修改过的代码,可以重置按钮(我无法阻止自己修改代码的其他部分,尽管还有更多的事情要做)
公共类TicTac扩展JFrame{
静态JButton[][]框=新JButton[4][4];
静态int[][]检查=新int[4][4];
静态JTextField blank1=新的JTextField();
静态JTextField blank2=新的JTextField();
静态整数匝数=1;
静态图像图标返回=新图像图标(“cardback.jpg”);
静态图像图标x=新图像图标(“x.jpg”);
静态图像图标o=新图像图标(“o.jpg”);
公共交通谘询委员会({
JPanel gamePanel=newjpanel(新的GridLayout(5,4,10,10));
对于(int x=0;xYou正在通过构造函数将TicTac对象传递给TicTacEvent。我认为,您可以通过在restart函数中重置来再次使用相同的对象。我不确定这一点,因为创建事件和事件监听器检查观察者模式将有助于您如果您创建GUI模型,并将其与GUI视图分离,那么您可以通过重新初始化模型字段。无需重新创建视图。该模式称为。@PramodPP。您能澄清一下吗?您需要创建一个函数,用于在TicTac中重置UI。第一次初始化时在cunstuctor中调用它。然后在restart中,您可以使用gui.restart()其他操作也使用相同的gui。如果不清楚,请发布完整的代码。我会尽力帮助您设置按钮,它们被设置为图片,这仍然有效吗?我很抱歉,您可以根据需要重置按钮上的图片well@user18035551感谢您为您的评论付出努力。我已经在我的restart()中尝试过了;方法已单击=0;int name=0;字符串newname;用于(int x=0;x谢谢,我会慢慢地纠正你说的话,讽刺的是,这是我的老师代码,不是我的,我的任务是添加赢/输计数器和板的大小。有点困在第22条军规中,无法了解更多,因为我还没有把这个交给你看未来的课程,哈哈。@Alivesi如果帖子中的代码是你老师的代码,请停止使用c立即投诉其不称职(不是开玩笑)。至于代码,您不需要再次添加按钮,只需设置现有按钮的文本和图像。抱歉,我很不好意思继续要求进一步澄清。我不确定我是否理解您试图解释的内容。设置文本?除此之外,我尝试通过循环和[x][y]设置现有按钮的图像。设置图标(返回);而且它仍然不会设置任何图像,这很奇怪,因为它在我以前的代码中工作。我以前从未感觉过这种无知的编码@user1803551@Alivesi在你尽了最大努力之后,不要害羞地寻求帮助。我编辑了我的答案。
TicTac restartok = new TicTac();
boxes[x][y] = new JButton(newname);
boxes[x][y].setIcon(back);
public class TicTac extends JFrame {
static JButton[][] boxes = new JButton[4][4];
static int[][] check = new int[4][4];
static JTextField blank1 = new JTextField();
static JTextField blank2 = new JTextField();
static int turns = 1;
static ImageIcon back = new ImageIcon("cardback.jpg");
static ImageIcon x = new ImageIcon("x.jpg");
static ImageIcon o = new ImageIcon("o.jpg");
public TicTac() {
JPanel gamePanel = new JPanel(new GridLayout(5, 4, 10, 10));
for (int x = 0; x<=3; x++) {
for (int y = 0; y<=3; y++) {
boxes[x][y] = new JButton(""+x+y, back);
boxes[x][y].addActionListener(new XOActionListenr(x, y));
gamePanel.add(boxes[x][y]);
}
}
JButton play = new JButton("Play");
JButton restart = new JButton("Restart");
play.addActionListener(new PlayActionListenr());
restart.addActionListener(new RestartActionListenr());
setLayout(new FlowLayout());
gamePanel.add(blank1);
gamePanel.add(play);
gamePanel.add(blank2);
gamePanel.add(restart);
add(gamePanel);
setTitle("Tic Tac Toe");
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void winner() {
// Check for winner
}
private class XOActionListenr implements ActionListener {
private int row, col;
private XOActionListenr(int row, int col) {
this.row = row;
this.col = col;
}
public void actionPerformed(ActionEvent e) {
if (turns % 2 == 0) {
boxes[row][col].setText("O");
boxes[row][col].setIcon(o);
check[row][col] = 2;
}
else {
boxes[row][col].setText("X");
boxes[row][col].setIcon(x);
check[row][col] = 1;
}
winner();
turns++;
}
}
private class PlayActionListenr implements ActionListener {
public void actionPerformed(ActionEvent e) {
// Not sure why you would need the "play" button at all,
// but insert here what it's supposed to do
}
}
private class RestartActionListenr implements ActionListener {
public void actionPerformed(ActionEvent e) {
for (int x = 0; x<=3; x++) {
for (int y = 0; y<=3; y++) {
boxes[x][y].setText(""+x+y);
boxes[x][y].setIcon(back);
}
}
}
}
public static void main(String[] arguments) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TicTac();
}
});
}
}