Как определить, какая кнопка была нажата — Java

#java #button

#java #кнопка

Вопрос:

Проблема: ниже приведен некоторый код для создания фрейма, заполненного кнопками. После нажатия кнопки мне нужно будет узнать координаты нажатой кнопки. Впоследствии программа проверит статус этой конкретной плитки, и в зависимости от статуса она должна измениться на определенный цвет. У меня возникли некоторые проблемы при удалении этой координаты, может кто-нибудь мне помочь? (Я только учусь программировать на Java, поэтому мой код может быть не идеальным)

Код:

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

public class GUIBoard {

    JPanel buttonPanel = new JPanel();
    JButton button = new JButton();
    JFrame frame;

    ButtonClicked clicked = new ButtonClicked();

    public GUIBoard(String title, int nbRows, int nbColumns) {

        frame = new JFrame(title);
                
        buttonPanel.setLayout(new GridLayout(nbRows, nbColumns));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
    
        for (int i = 0; i < nbRows; i  ) {
            for(int j = 0; j < nbColumns; j  ) {
                button = new JButton();
                button.setBackground(Color.LIGHT_GRAY);
                button.addActionListener(clicked);
                gbc.gridx = j;
                gbc.gridy = i;
                buttonPanel.add(button, gbc);
            }
        }
    
        frame.setPreferredSize(new Dimension(1000, 600));
        frame.getContentPane().add(buttonPanel, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    
    }

    private class ButtonClicked implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
        
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new GUIBoard("Batlleship Board", 10,10);
            }
        });
    }
}
 

Комментарии:

1. Задайте идентификатор для кнопки и используйте HashMap, чтобы связать ее с точкой.

2. Что вы имеете в виду coordinates ? Местоположение размещения (x, y) или расположение сетки (строка, столбец)?

Ответ №1:

Если coordinates вы имеете в виду фактическое x местоположение и y местоположение нажатой кнопки, то вы можете использовать это в своем событии buttons actionPerformed:

 public void actionPerformed(ActionEvent e) {
    JButton btn = (JButton)e.getSource();
    System.out.println(btn.getX()   ", "   btn.getY());
}
 

Будет напечатано верхнее левое расположение кнопки, на которую нажали. Однако это не очень полезно, поскольку эти местоположения могут измениться, если каким-либо образом изменить размер формы.

Если вы имеете в виду расположение сетки, как в строке и столбце нажатой кнопки, то проще всего было бы убедиться, что идентификатор применяется к каждой из кнопок, поместив местоположение сетки в свойство buttons Name, например, при создании ваших кнопок:

 for (int i = 0; i < nbRows; i  ) {
    for (int j = 0; j < nbColumns; j  ) {
        button = new JButton();
        // Apply an identifier to the Button:
        button.setName(new StringBuilder("Button_").append(i)
                        .append(",").append(j).toString());
        button.setBackground(Color.LIGHT_GRAY);
        button.addActionListener(clicked);
        gbc.gridx = j;
        gbc.gridy = i;
        buttonPanel.add(button, gbc);
    }
}
 

Затем в ваших кнопках actionPerformed событие:

 public void actionPerformed(ActionEvent e) {
    JButton btn = (JButton)e.getSource();
    System.out.println(btn.getName());
}
 

Комментарии:

1. Я согласен с тем, что добавление сведений о координатах JButton — это правильный путь, однако я думаю, что более простой реализацией было бы использование свойств клиента . Просто установите свойство, значением которого является, например, java.awt.Point .

2. Конечно, почему бы и нет. Как вам угодно. Код легко модифицируется. Это всего лишь пример.

Ответ №2:

Теперь, когда я думаю, что понял, что вы хотите сделать, я собираюсь дать вам новый и более простой подход: вот код, вам просто нужно использовать метод getSource(), чтобы получить экземпляр кнопки, которая была нажата. Затем вы меняете цвет.

 public class GUIBoar {

JPanel buttonPanel = new JPanel();
JButton button = new JButton();
JFrame frame;


public GUIBoar(String title, int nbRows, int nbColumns) {

    frame = new JFrame(title);

    buttonPanel.setLayout(new GridLayout(nbRows, nbColumns));
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.BOTH;

    for (int i = 0; i < nbRows; i  ) {
        for (int j = 0; j < nbColumns; j  ) {
            button = new JButton();
            button.setBackground(Color.LIGHT_GRAY);
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e){
                    Object source = e.getSource();
                    JButton b = (JButton)source;
                    b.setBackground(Color.RED); //IMAGINE THATS THE COLOR
                }
            });
            gbc.gridx = j;
            gbc.gridy = i;
            buttonPanel.add(button, gbc);
        }
    }

    frame.setPreferredSize(new Dimension(1000, 600));
    frame.getContentPane().add(buttonPanel, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);

}


public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new GUIBoar("Batlleship Board", 10, 10);
        }
    });
}
 

}

Комментарии:

1. Я согласен с вами, я этого не объяснял, я собираюсь отредактировать свой пост.