Пишу "крестики ноли". Создал 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);
}
}
}
}
Проблема в том, что в каждом цикле вы заново создаете кнопки для каждой панели в одном и том же массиве. Можно решить так:
rightButtons
, для центральной - centralButtons
и т.д.)Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возник вопрос, копаюсь долго не могу решить: что-то слетело в студио и java классы во всех проектах не определяются, вместо привычного значка...
Как добавить ещё несколько аргументов в метод onBindViewHolder()? Каждый раз при попытке добавить новый аргумент, мне предлагается повторно implement'ировать...
Есть список, в котором при нажатии на элемент списка я закрываю фрагмент