Search code examples
javaarraysswingjframejbutton

Could somebody help me with adding text to a JAVA Jbutton when it is clicked?


Basically, it's giving me a problem about declaring each button in the "for" loop as final before it'll add the text. When I do that, it gives me a ton of other errors. Could somebody help me out with this?

import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class tictactoe {
    public static final int FRAME_WIDTH = 700;
    public static final int FRAME_HEIGHT = 200;
    public static void main(String[] args)          
    {
        int slots = 9;
        JButton[] gameButton = new JButton[9];

        JPanel ticTacToeBoard = new JPanel();
        ticTacToeBoard.setLayout(new GridLayout(3, 3));
        for (int i = 0; i < slots; i++)
        {

                gameButton[i] = new JButton();
                ticTacToeBoard.add(gameButton[i]);

                gameButton[i].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gameButton[i].setText("x");
            }
            });
        }



        JButton clearButtons = new JButton("New Game");
        JButton exit = new JButton("Exit");
        JPanel rightPanel = new JPanel();
        JLabel wonLabel = new JLabel();
        rightPanel.setLayout(new GridLayout(1, 3));
        rightPanel.add(wonLabel);
        rightPanel.add(clearButtons);
        rightPanel.add(exit);
        JFrame mainFrame = new JFrame();
        mainFrame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        mainFrame.setVisible(true);
        mainFrame.setLayout(new GridLayout(1,2));
        mainFrame.add(ticTacToeBoard);
        mainFrame.add(rightPanel);
    }



}

Solution

  • Try replacing the action listener with this:

    gameButton[i].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ((JButton)e.getSource()).setText("x");
    }
    

    Regarding the original error:

    Any local variable, formal method parameter or exception handler parameter used but not declared in an inner class must be declared final. Any local variable, used but not declared in an inner class must be definitely assigned (§16) before the body of the inner class.