【问题标题】:Find the index of a Java JButton Array查找 Java JButton 数组的索引
【发布时间】:2015-07-02 19:30:46
【问题描述】:

我正在编写一个 Java 程序,其中有一组按钮(不是计算器!),我正在寻找一种有效的方法来了解单击了哪个 JButton。根据我目前对 Java 的了解,唯一的方法是将它们全部放在同一个 ActionListener 中,然后循环查找匹配项。

我刚刚想到的另一个解决方案是扩展 JButton 以在构造函数中包含一个唯一的 ID 号变量。在 instanceof 检查后将事件对象强制转换为 JButton 时,这似乎应该起作用。有点像使用分配给索引号的 VB 的 Tag 属性。

有没有更好/更优雅的方式?

【问题讨论】:

  • 您可以使用 setName 和 getName 方法为每个 JButton 分配一个唯一的 ID。
  • 小心setName 如果在操作之前设置它可能会得到nulled。
  • 这是可能的。我不知道这些方法,它们是 JComponent 的一部分。这是一件好事。这实际上也有助于另一个程序。谢谢!
  • Dima,你的意思是被某种方式覆盖了吗?
  • 如果您创建一个JButton,然后在其上调用setName("name"),然后调用setAction(new AbstractAction(...)),下一次调用getName 将返回null。看看this

标签: java arrays swing jbutton


【解决方案1】:

有没有更好/更优雅的方式?

指向 Javadocs 的链接:putClientProperty()getClientProperty()

【讨论】:

  • 不知道这些方法,很好。
  • @Sean Bright 请问哪一个 1:-)。 ClientProperty 或(我最喜欢的)2:-)。事件处理程序
  • put/getClientProperty
【解决方案2】:

这是我过去几个月编写的程序示例。 我有一个名为 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】:

    我之前的做法是对不同的按钮使用 actionPerformed。与我见过的其他方式相比,我更喜欢它。

    public void actionPerformed(ActionEvent clicking)
    {
        if (clicking.getSource() == button[0])
            // Do this
        if (clicking.getSource() == button[1])
            // Do something different
    }
    

    由于您构建了一个数组,您可以将 ID 放在 0 所在的位置,这就是您的唯一 ID。

    【讨论】:

      【解决方案4】:

      为每个按钮添加一个单独的动作监听器。

      【讨论】:

      • 我将使用的数组有 64 个 JButton。拥有这么多 ActionListener 会产生任何开销或减速吗?如果没有那么多,会更多吗?仅供以后参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多