Java-使用2d数组创建按钮网格

Java-使用2d数组创建按钮网格,java,arrays,swing,button,actionlistener,Java,Arrays,Swing,Button,Actionlistener,作为练习的一部分,我想设计一个显示9x9 JButton网格的程序。当我点击一个按钮时,我希望该按钮以某种方式改变,比如说,最初它显示一个“o”,但当你点击它时,它显示一个“x”,或者它改变颜色,等等,而其他按钮保持不变 然而,我不知道如何做到这一点。我已经创建了一个JButton的2D数组,并将每个按钮放置在9x9 GridLayout面板中。我还为每一个设置了一个ActionListener。问题是,我不知道如何改变颜色或文字只有一个按钮。这是我的程序的简短版本,仅显示相关部分 privat

作为练习的一部分,我想设计一个显示9x9 JButton网格的程序。当我点击一个按钮时,我希望该按钮以某种方式改变,比如说,最初它显示一个“o”,但当你点击它时,它显示一个“x”,或者它改变颜色,等等,而其他按钮保持不变

然而,我不知道如何做到这一点。我已经创建了一个JButton的2D数组,并将每个按钮放置在9x9 GridLayout面板中。我还为每一个设置了一个ActionListener。问题是,我不知道如何改变颜色或文字只有一个按钮。这是我的程序的简短版本,仅显示相关部分

private JButton[][] t = new JButton[9][9]; //Declared much earlier in the program, right after the class declaration.

public void buildTile()
{
    panelc.setLayout(new GridLayout(9, 9));
    for(int r = 0; r < 9; r++)
    {
        for(int c = 0; c < 9; c++)
        {
            t[r][c] = new JButton("O");
            t[r][c].setBackground(Color.BLACK);
            t[r][c].setForeground(Color.WHITE);
            t[r][c].addActionListener(new TileListener());
            panelc.add(t[r][c]);
        }
    }
}

private class TileListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //Some code to change a specific button
    }
}

如何指定要对哪个按钮执行某种美学更改?

在actionlistener中,e.getSource将返回您单击的按钮

是,但打印到控制台时只返回类似于:javax.swing.JButton的内容[,2,2,66x49,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@1b3c169,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverSelectedIcon=,rolloverSelectedIcon=,selectedIcon=,text=O,defaultCapable=true]我对e.getSource没有任何其他帮助。好的,我要说清楚:你通过调用e.getSource获得一个对象。你应该将它转换为JButton:JButton e.getSource,然后你可以用它做任何你想做的事情,例如:JButton e.getSource.setText…这工作得很好。很抱歉,我对Java相当陌生,而且没有什么特别的功能甚至这种技术以前也应用过。你能解释一下这条语句到底是做什么的吗?当然!e是事件鼠标单击现在getSource方法获取事件的源,所以它将返回你单击的按钮。但是这个方法不是来自JButton,所以它将返回一个对象,但是对象没有setText方法,所以你必须使用cas不要将它转换为JButton。尝试将其转换为其他类似JLabel的对象,您将获得ClassCastException,因为它不是JLabel JButton。getSource会这样做,现在您单击了JButton,并可以对其执行任何操作。如果您想做更多更改,请使用:JButton clickedButton=JButton e.getSource;…谢谢。我真不敢相信我没有er以前使用过铸造。这会在以前的练习中为我节省很多麻烦。ActionEventgetSource?