Обратите внимание, что вы можете расширить классы реализации слушателя, такие как MouseAdapter
, чтобы сэкономить немного времени при наборе (только те методы, которые вы хотите использовать).
Вместо того, чтобы использовать одного слушателя и иметь кучу операторов case, чтобы попытаться выяснить связь между кнопкой и данными, добавьте нового слушателя к каждой кнопке и удерживайте данные в слушателе. Этот код делает это с анонимным классом .
public static void main(String[] args) {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 4));
String[] buttonName = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F" };
for (final String name : buttonName) {
JButton button = new JButton(name);
panel.add(button);
button.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e) {
System.out.println("pressed:" + name);
}
@Override public void mouseReleased(MouseEvent e) {
System.out.println("released:" + name);
}
});
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
Обратите внимание на использование ключевого слова final
.
Есть и другие способы выразить это, если вы предпочитаете. Этот метод добавляет статический внутренний класс:
private static class MyListener extends MouseAdapter {
private final String name;
public MyListener(String name) {
this.name = name;
}
@Override public void mousePressed(MouseEvent e) {
System.out.println("pressed:" + name);
}
@Override public void mouseReleased(MouseEvent e) {
System.out.println("released:" + name);
}
}
public void addStaticInnerClassListener(JButton button, String name) {
button.addMouseListener(new MyListener(name));
}
В этом классе используется область действия метода:
public void addNameListener(JButton button, final String name) {
class MyListener extends MouseAdapter {
@Override public void mousePressed(MouseEvent e) {
System.out.println("pressed:" + name);
}
@Override public void mouseReleased(MouseEvent e) {
System.out.println("released:" + name);
}
}
button.addMouseListener(new MyListener());
}
Код / действие, которое вы хотите выполнить, должно быть выполнено в другом потоке. Для этого Swing предоставляет несколько служебных классов, таких как SwingWorker
.