Как в цикле событие кнопок добавить?

430
28 мая 2017, 19:54

Пишу "крестики ноли". Создал 9 панелей по девять кнопок. Подскажите, как в цикле добавить этим кнопкам обработчик событий? В инициализации кнопок событие через this ниже реализован метод ActionPerfomed, но работает только с последней панелью. Заранее спасибо!

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 * Created by Александр on 21.05.2017.
 */
public class Window extends JFrame implements ActionListener {
    JButton[] buttons = new JButton[9];
    CompPlayer compPlayer;
    public int freeButton = 9;
    public Window() {
        this.setTitle("my game v 1.0");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setSize(400, 400);
        JPanel mainPanel = new JPanel();
        BorderLayout bd = new BorderLayout();
        mainPanel.setLayout(bd);
        JPanel cenralPanel = new JPanel();
        JPanel left = new JPanel();
        JPanel center = new JPanel();
        JPanel right = new JPanel();
        JPanel left1 = new JPanel();
        JPanel center1 = new JPanel();
        JPanel right1 = new JPanel();
        JPanel left2 = new JPanel();
        JPanel center2 = new JPanel();
        JPanel right2 = new JPanel();
        GridLayout gr = new GridLayout(3,3);
        left.setLayout(gr);
        center.setLayout(gr);
        right.setLayout(gr);
        left1.setLayout(gr);
        center1.setLayout(gr);
        right1.setLayout(gr);
        left2.setLayout(gr);
        center2.setLayout(gr);
        right2.setLayout(gr);
        cenralPanel.add(left);
        cenralPanel.add(center);
        cenralPanel.add(right);
        cenralPanel.add(left1);
        cenralPanel.add(center1);
        cenralPanel.add(right1);
        cenralPanel.add(left2);
        cenralPanel.add(center2);
        cenralPanel.add(right2);
        for (int j=0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            left.add(buttons[j]);
            buttons[j].addActionListener(this);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            center.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            right.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            left1.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for ( int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            center1.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            right1.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            left2.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
           center2.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        for (int j = 0; j < buttons.length; j++) {
            buttons[j] = new JButton();
            buttons[j].addActionListener(this);
            right2.add(buttons[j]);
            buttons[j].setText(String.valueOf(j));
        }
        mainPanel.add("Center", cenralPanel);
        setContentPane(mainPanel);
        this.setVisible(true);
        compPlayer = new CompPlayer();
    }
    public String checkWiner() {
        String winner = "";
        for (int j = 0; j < 3; j++) {
            if (buttons[j].getText().equals(buttons[j + 1].getText()) &&
                    (buttons[j + 1].getText().equals(buttons[j + 2].getText())) &&
                    (!buttons[j].getText().equals(""))) {
                System.out.println("win player");
                winner = buttons[j].getText();
                break;
            }
        }
        for (int j = 0; j < 3; j++) {
            if (buttons[j].getText().equals(buttons[j + 3].getText()) &&
                    (buttons[j + 3].getText().equals(buttons[j + 6].getText()))
                    && (!buttons[j].getText().equals(""))) {
                System.out.println("win player");
                winner = buttons[j].getText();
                break;
            }
        }
        if (buttons[0].getText().equals(buttons[4].getText()) &&
                (buttons[4].getText().equals(buttons[8].getText())) &&
                (!buttons[8].getText().equals(""))) {
            System.out.println("win player");
            winner = buttons[0].getText();
        }
        if (buttons[2].getText().equals(buttons[4].getText()) &&
                (buttons[4].getText().equals(buttons[6].getText())) &&
                (!buttons[6].getText().equals(""))) {
            System.out.println("win player");
            winner = buttons[2].getText();
        }
        if (freeButton == 0 && winner.equals("")) {
            winner = "nichia";
        }
        return winner;
    }
    public void actionPerformed(ActionEvent e) {
        for (int j = 0; j < buttons.length; j++) {
            if (e.getSource() == buttons[j]) {
                buttons[j].setText("X");
                buttons[j].setEnabled(false);
                buttons[j].setBackground(Color.RED);
                this.freeButton--;
                checkWiner();
            }
        }
        if (checkWiner().equals("") && freeButton > 0) {
            if (!buttons[0].isEnabled()) {
                compPlayer.min = 1;
                compPlayer.max = 5;
                compPlayer.play(this);
            }
        }
    }
}
Answer 1

Проблема в том, что в каждом цикле вы заново создаете кнопки для каждой панели в одном и том же массиве. Можно решить так:

  1. Создать массив для каждой панели отдельно (например, для правой панели rightButtons, для центральной - centralButtons и т.д.)
  2. Создать двумерный массив 9x9, где определенный ряд отвечает определенной панели.
READ ALSO
не определяются java классы

не определяются java классы

Возник вопрос, копаюсь долго не могу решить: что-то слетело в студио и java классы во всех проектах не определяются, вместо привычного значка...

245
Добавить аргументы в метод onBindViewHolder?

Добавить аргументы в метод onBindViewHolder?

Как добавить ещё несколько аргументов в метод onBindViewHolder()? Каждый раз при попытке добавить новый аргумент, мне предлагается повторно implement'ировать...

255
Обфускация имен в res андроид

Обфускация имен в res андроид

ЗдравствуйтеВ папке values colors

245
Закрывать корректно фрагмент

Закрывать корректно фрагмент

Есть список, в котором при нажатии на элемент списка я закрываю фрагмент

198