2D массив JButton, хочу добавить к ним actionlisteners для игры - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу сделать игру TI C TA C TOE, но у меня проблема. Я создал двумерный массив и не знаю, как с ним обращаться, чтобы заставить работать ActionListener.

Вот мой код:

public class GUI {
    public static JButton[][] buttonsall = new JButton[3][3];
    public static JFrame frame = new JFrame("TIC TAC TOE");
    public static void draw() {
        // frame
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setBackground(Color.white);
        frame.setBounds(500, 500, 600,600);
        // actionListener
        ActionListener listener = new ActionListener() {
             @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() instanceof JButton) {
                        //dont know further here
                    }
                }
            };

        //buttons buttonsall[x][y]
        for (int y = 0; y<3;y++) {
            for (int x = 0; x<3;x++) {
                buttonsall[x][y] = new JButton();
                buttonsall[x][y].setVisible(true);
                buttonsall[x][y].setSize(80, 80);
                buttonsall[x][y].addActionListener(listener);
                System.out.println(buttonsall[x][y] +" "+x +" "+y);
                frame.add(buttonsall[x][y]);
                buttonsall[x][y].setBackground(Color.white);    
            }   
        }
        frame.setLayout(new GridLayout(3,3));
    }

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Вы можете установить имя для каждого JButton во время его создания. Я обновляю ваш код, как показано ниже:


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

public class GUI {
    public static JButton[][] buttonsall = new JButton[3][3];
    public static JFrame frame = new JFrame("TIC TAC TOE");

    public static void draw() {
        // frame
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setBackground(Color.white);
        frame.setBounds(500, 500, 600, 600);
        // actionListener
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() instanceof JButton) {
                    //dont know further here
                    JButton b = (JButton)e.getSource();

                    System.out.println("Button is:" + b.getName());
                }
            }
        };

        //buttons buttonsall[x][y]
        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                buttonsall[x][y] = new JButton();
                buttonsall[x][y].setVisible(true);
                buttonsall[x][y].setName("Button_" + x + "_" + y);
                buttonsall[x][y].setSize(80, 80);
                buttonsall[x][y].addActionListener(listener);
                System.out.println(buttonsall[x][y] + " " + x + " " + y);
                frame.add(buttonsall[x][y]);
                buttonsall[x][y].setBackground(Color.white);
            }
        }
        frame.setLayout(new GridLayout(3, 3));
    }

    public static void main(String[] args) {

        GUI.draw();

    }
}

0 голосов
/ 22 февраля 2020

Ваш вопрос очень похож на этот вопрос .

По сути вы хотите использовать ActionEvent.getSource() и привести его к JButton. Затем вы можете делать все, что вы хотите для JButton (изменить цвет фона, изменить текст и т. Д. c.)

РЕДАКТИРОВАТЬ: я не понял, что вы хотели получить x и y кнопки JButton.

public class TicTacToe {
    public static TicTacToeButton[][] buttonsall = new TicTacToeButton[3][3];
    public static JFrame frame = new JFrame("TIC TAC TOE");
    public static void draw() {
        // frame
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setBackground(Color.white);
        frame.setBounds(500, 500, 600,600);
        // actionListener
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                if (source instanceof TicTacToeButton) {
                    TicTacToeButton btn = (TicTacToeButton) source;
                    int btnBoardX = btn.getBoardX();
                    int btnBoardY = btn.getBoardY();
                    // Go ahead and do what you like
                }
            }
        };

        //buttons buttonsall[x][y]
        for (int y = 0; y<3;y++) {
            for (int x = 0; x<3;x++) {
                buttonsall[x][y] = new TicTacToeButton(x, y);
                buttonsall[x][y].setVisible(true);
                buttonsall[x][y].setSize(80, 80);
                buttonsall[x][y].addActionListener(listener);
                System.out.println(buttonsall[x][y] +" "+x +" "+y);
                frame.add(buttonsall[x][y]);
                buttonsall[x][y].setBackground(Color.white);
            }
        }
        frame.setLayout(new GridLayout(3,3));
    }

    private static class TicTacToeButton extends JButton {
        private int boardX;
        private int boardY;

        public TicTacToeButton(int boardX, int boardY) {
            super();
            this.boardX = boardX;
            this.boardY = boardY;
        }

        public int getBoardX() {
            return this.boardX;
        }

        public int getBoardY() {
            return this.boardY;
        }
    }
}
...