我正在编写一个Java程序,其中有一系列按钮(不是计算器!),我正在寻找一种有效的方法来了解哪个JButton被点击了。根据我目前对Java的了解,唯一的方法是将它们全部放在同一个ActionListener中,然后循环查找匹配项。
我刚想到的另一个解决方案是扩展JButton以在构造函数中包含唯一的ID号变量。在检查instanceof后将事件对象强制转换为JButton时,似乎应该可以工作。有点像使用VB的Tag属性,该属性被分配给索引号。
有更好/更优雅的方式吗?
答案 0 :(得分:5)
有更好/更优雅的方式吗?
是的(几乎为JComponent
s)使用put/getClientProperty,你可以设置无数的属性,可以与setName
/ {{相乘1}} / etc
setActionCommand
可用作Swing Action或EventHandler的唯一标识符(而非使用ActionListener)
指向Javadocs的链接:putClientProperty(),getClientProperty()
答案 1 :(得分:0)
我以前的方式是使用actionPerformed用于不同的按钮。与我见过的其他方式相比,我更喜欢它。
public void actionPerformed(ActionEvent clicking)
{
if (clicking.getSource() == button[0])
// Do this
if (clicking.getSource() == button[1])
// Do something different
}
由于您构建了一个数组,因此可以将ID放在该0的位置,这是您的唯一ID。
答案 2 :(得分:0)
以下是我最近几个月编写的程序示例。 我有一个名为Position
的枚举public enum Position {
BB, SB, BU, CO, MP3, MP2, MP1, EP3, EP2, EP1;
}
并且有一些JToggleButtons,每个都持有自己的位置。
public class PositionButton extends JToggleButton {
private final Position p;
public PositionButton(Position p) {
this.p = p;
setText(p.toString());
setActionCommand(p.toString());
}
public Position getPosition() {
return p;
}
}
这允许您在循环中创建按钮并直接从按钮获取值而不进行比较:
ActionListener positionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
PositionButton b = (PositionButton )e.getSource();
Position p = b.getPosition();
//do something with Position
}
}
for (Position p : Position.values()) {
PositionButton b = new PositionButton (p);
b.addActionListener(positionListener);
}
答案 3 :(得分:-1)
为每个按钮添加单独的动作侦听器。