Java 我的Tictatcoe游戏中的每个按钮都有相同的代码。如何使这个简短?

Java 我的Tictatcoe游戏中的每个按钮都有相同的代码。如何使这个简短?,java,swing,debugging,jbutton,tic-tac-toe,Java,Swing,Debugging,Jbutton,Tic Tac Toe,这是一个2人游戏。我制作的GUI是框架和按钮,之后我开始编码。实际上我的程序就是用这种编码的 private String letter= " "; private int count= 0; private void btn7ActionPerformed(java.awt.event.ActionEvent evt) { count++; if(count =

这是一个2人游戏。我制作的GUI是框架和按钮,之后我开始编码。实际上我的程序就是用这种编码的

private String letter= " ";
private int count= 0;


    private void btn7ActionPerformed(java.awt.event.ActionEvent evt) {                                     
        count++;
                if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){

                letter = "X";

                } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){

                letter = "O";

                }

        if(evt.getSource() == btn1){

                        btn1.setText(letter);

                } else if(evt.getSource() == btn2){

                        btn2.setText(letter);

                } else if(evt.getSource() == btn3){

                        btn3.setText(letter);

                } else if(evt.getSource() == btn4){

                        btn4.setText(letter);

                } else if(evt.getSource() == btn5){

                        btn5.setText(letter);

                } else if(evt.getSource() == btn6){

                        btn6.setText(letter);

                } else if(evt.getSource() == btn7){

                        btn7.setText(letter);

                } else if(evt.getSource() == btn8){

                        btn8.setText(letter);

                } else if(evt.getSource() == btn9){

                        btn9.setText(letter);




    }         
    }                                    

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    count++;
                if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){

                letter = "X";

                } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){

                letter = "O";

                }

        if(evt.getSource() == btn1){

                        btn1.setText(letter);

                } else if(evt.getSource() == btn2){

                        btn2.setText(letter);

                } else if(evt.getSource() == btn3){

                        btn3.setText(letter);

                } else if(evt.getSource() == btn4){

                        btn4.setText(letter);

                } else if(evt.getSource() == btn5){

                        btn5.setText(letter);

                } else if(evt.getSource() == btn6){

                        btn6.setText(letter);

                } else if(evt.getSource() == btn7){

                        btn7.setText(letter);

                } else if(evt.getSource() == btn8){

                        btn8.setText(letter);

                } else if(evt.getSource() == btn9){

                        btn9.setText(letter);
是的,它实际上正在工作,但我的问题是,我需要在每个按钮中添加代码,例如按钮7、按钮1(这些只是我的按钮示例),这些代码是按钮执行的操作


我只需要每个按钮执行一个命令,我不想复制每个按钮中的粘贴,因为它们是相同的代码。我认为有一个代码可以做到这一点,你认为呢?请帮忙

因此,基本上,您希望将逻辑折叠到单个处理程序中。此处理程序需要对其所操作的按钮的单个引用

类似于

public class ActionHandler implements ActionListener {

    private JButton master;

    public ActionHandler(JButton master) {
        this.master = master;
    }

    protected void setText(String text) {
        master.setText(text);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        String text = null;

        count++;
        if (count / 2f == Math.round(count / 2f)) {
            text = "O";
        } else {
            text = "X";
        }

        setText(text);

    }

}
现在您的设置代码可能与此不同,这只是一个示例

buttons = new JButton[9]; // You can use this to reset the board ;)
setLayout(new GridLayout(3, 3));
for (int index = 0; index < 9; index++) {
    JButton btn = new JButton(Integer.toString(index));
    buttons[index] = btn;
    btn.addActionListener(new ActionHandler(btn));
    add(btn);
}
buttons=newjbutton[9];//您可以使用此选项重置电路板;)
setLayout(新的GridLayout(3,3));
对于(int-index=0;index<9;index++){
JButton btn=新JButton(Integer.toString(index));
按钮[索引]=btn;
addActionListener(新ActionHandler(btn));
添加(btn);
}

基本思想是,当您创建一个新按钮时,您可以为它分配自己的
ActionHandler
并向它传递一个按钮的引用。这允许动作处理程序根据游戏的状态控制按钮。

我真的不知道您是如何试图解决这个游戏逻辑的,尽管您的代码可以压缩为以下形式:

int count = -1;
String letter = "";  
JButton[] button = new JButton[9];  // These three being your Instance Variables
for (int i = 0; i < 9; i++, counter++)
{
    final int counter = i;
    button[i] = new JButton("");
    button[i].addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            count++;
            if (count % 2 != 0)
                letter = "X";
            else
                letter = "O";
            button[counter].setText(letter); 
        }
    });
}
int count=-1;
字符串字母=”;
JButton[]按钮=新JButton[9];//这三个变量是您的实例变量
对于(int i=0;i<9;i++,计数器++)
{
最终整数计数器=i;
按钮[i]=新的JButton(“”);
按钮[i].addActionListener(新建ActionListener())
{
@凌驾
已执行的公共无效行动(行动事件ae)
{
计数++;
如果(计数%2!=0)
字母=“X”;
其他的
字母=“O”;
按钮[计数器].setText(字母);
}
});
}

创建单个
ActionListener
,然后将其注册到所有按钮。然后使用
event.getSource()
识别按钮,并相应地执行其余操作。嗨!在生成的代码中,我找到了这一行btn1.addActionListener(new java.awt.event.ActionListener(){public void actionPerformed(java.awt.event.ActionEvent evt){btn1ActionPerformed(evt);我认为java已经自动生成了代码。你认为哪里不对?是的,你是对的,这就是我现在正在做的事情!:D