Java 错误的按钮激活

Java 错误的按钮激活,java,Java,我希望我单击的按钮被禁用并显示图像,但以下程序正在禁用帧中的最后一个按钮,无论我单击哪个按钮,我做错了什么 import java.awt.*; import java.awt.event.*; import javax.swing.*; class TicTacToe{ public static void main(String args[]){ EventQueue.invokeLater(new Runnable(){ public vo

我希望我单击的按钮被禁用并显示图像,但以下程序正在禁用帧中的最后一个按钮,无论我单击哪个按钮,我做错了什么

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TicTacToe{
    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                JFrame frame=new GameFrame();
                frame.setTitle("BATTLESHIPS");
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Image img=new ImageIcon("icon.gif").getImage();
                frame.setIconImage(img);
            }
        });
    }
}


class GamePanel extends JPanel{
    private JPanel panel;
    private boolean start;
    private ActionListener listener;
    public GamePanel(){
        start=true;
        setLayout(new BorderLayout());
        panel=new JPanel();
        panel.setLayout(new GridLayout(3,3));

        listener=new ClickButton();

        addButton("");
        addButton("");
        addButton("");
        addButton("");
        addButton("");
        addButton("");
        addButton("");
        addButton("");
        addButton("");

        add(panel,BorderLayout.CENTER);
    }
    void addButton(String label){
        JButton button=new JButton(label);
        button.addActionListener(listener);
        panel.add(button);
    }



    class ClickButton implements ActionListener{
        public void actionPerformed(ActionEvent event){
            String input=event.getActionCommand();
            if(start){
                {
                Image img=new ImageIcon("icon.gif").getImage();
                button.setText("");
                button.setIcon(new ImageIcon(img));
                button.setEnabled(false);
                }
            }
        }
    }
}

class GameFrame extends JFrame{
    public GameFrame(){
        add(new GamePanel());
        pack();
    }
}

动作侦听器仅引用上次创建的按钮的值。

动作侦听器仅引用上次创建的按钮的值。

这是因为您正在禁用上次添加的按钮

您应该使用单击的按钮,可以通过
event.getSource()
获得该按钮。应该是这样的:

public void actionPerformed(ActionEvent event){
            String input=event.getActionCommand();
            if(start){
                {
                Image img=new ImageIcon("icon.gif").getImage();
                JButton clicked = (JButton)event.getSource();
                clicked.setText("");
                clicked.setIcon(new ImageIcon(img));
                clicked.setEnabled(false);
                }
            }
        }

这是因为您正在禁用上次添加的
按钮

您应该使用单击的按钮,可以通过
event.getSource()
获得该按钮。应该是这样的:

public void actionPerformed(ActionEvent event){
            String input=event.getActionCommand();
            if(start){
                {
                Image img=new ImageIcon("icon.gif").getImage();
                JButton clicked = (JButton)event.getSource();
                clicked.setText("");
                clicked.setIcon(new ImageIcon(img));
                clicked.setEnabled(false);
                }
            }
        }

更糟糕的是,当您在
addButton()
中重写它时,所有其他按钮都没有参考。因此,为了准确地回答这个问题,您所犯的错误是
addButton()
方法,以及您每次都在不检查任何内容的情况下覆盖
button
的值。更糟糕的是,您在
addButton()
中过度编写的所有其他按钮都没有参考。因此,为了准确地回答这个问题,您所犯的错误是
addButton()
方法,并且您每次都会覆盖
按钮的值,而不检查任何内容。@hugososa,因为
按钮
字段仍然包含一个伪值,而且数据结构不会反映屏幕上的实际内容。对于您的解决方案,这个侦听器可以工作,但其余的代码仍然是错误的。解决方案可能是完全删除
按钮
字段,或者将其替换为包含所有已创建按钮的集合。@biziclop我应该对代码进行哪些更改才能使其正确?@biziclop可能OP甚至不需要该
按钮
。但是我想他知道,
按钮实际上是指最后创建/添加的按钮。@user3798851我们都是新手,所以我知道感觉如何。在这种情况下,正如@hugosusa所说,您需要做的是完全去掉
按钮
字段。它实际上并没有给你买任何东西,正如你所看到的,它很容易误导代码的读者。@user3798851只需从类成员中删除
按钮即可。你不需要它。在
addButton
方法中,只需创建一个新实例-
JButton-button=newjbutton(label)-并添加它,就是这样。@hugosusa,因为
按钮
字段仍将包含虚假值,并且数据结构不会反映屏幕上的实际内容。对于您的解决方案,这个侦听器可以工作,但其余的代码仍然是错误的。解决方案可能是完全删除
按钮
字段,或者将其替换为包含所有已创建按钮的集合。@biziclop我应该对代码进行哪些更改才能使其正确?@biziclop可能OP甚至不需要该
按钮
。但是我想他知道,
按钮实际上是指最后创建/添加的按钮。@user3798851我们都是新手,所以我知道感觉如何。在这种情况下,正如@hugosusa所说,您需要做的是完全去掉
按钮
字段。它实际上并没有给你买任何东西,正如你所看到的,它很容易误导代码的读者。@user3798851只需从类成员中删除
按钮即可。你不需要它。在
addButton
方法中,只需创建一个新实例-
JButton-button=newjbutton(label)-并添加它,就这样。到目前为止,您已经问了7个问题,但从未接受过答案。你知道吗,你应该接受对你帮助最大的答案,这样回答者就能从帮助你的努力中得到回报?你知道如何接受答案吗?请看这里:对不起,我真的不知道:(到目前为止,你已经问了7个问题,但从未接受过答案。你知道你应该接受对你帮助最大的答案吗?因此,回答者会从帮助你的努力中得到回报吗?你知道如何接受答案吗?请看这里:对不起,我真的不知道:(