Java 在另一个类文件中重置JPanel

Java 在另一个类文件中重置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

我在我的主类文件中创建了一个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");
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();
            }
        });
    }
}