#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. Я согласен с вами, я этого не объяснял, я собираюсь отредактировать свой пост.