在另一个 ArrayList 中找到 JButton 源

find JButton source in another ArrayList

我正在尝试构建一个 GUI 应用程序,让用户通过单击按钮来选择产品。我将产品保存在 ArrayList 中,然后使用此 ArrayList 和 for 循环来创建适当数量的 JButton。当用户单击按钮时,该产品的价格应出现在 TextField 中。 我的问题是:如何找出点击了哪个按钮?如果我使用的是按钮数组 (JButton button[] = new JButton[3]),我会在循环中找到它: 如果 (target.equals(按钮[i]))... 但是当我使用产品的 ArrayList 创建按钮时,我不知道如何找到它。任何帮助将不胜感激。这是我的代码(我尝试了很多方法,所以我只 post 我开始使用的那个 - 它只找到 ArrayList 中的最后一项)。

public void addStuff() {
stuffList.add(new Stuff("Lemon Haze", 15.00));
stuffList.add(new Stuff("OG Kush", 16.00));
stuffList.add(new Stuff("Strawberry Cough", 18.00));
for (int i = 0; i < stuffList.size(); i++) {
    stuffButton = new JButton();
    stuffPanel.add(stuffButton);
    stuffButton.setText(stuffList.get(i).getName());
    stuffButton.addActionListener(this);
}

}

public void actionPerformed(ActionEvent e) {
Object target = e.getSource();
for (int i = 0; i < stuffList.size(); i++) {
    if (target == stuffButton) {
        subtotalTextF.setText(stuffList.get(i).getPrice() + "");
    }
}

}

为您的 ActionListener 创建一个特定的 class,并为其提供对您的 Stuff 的引用 - 这样您就可以为每个自动链接回的按钮创建一个特定的实例Stuff 的正确实例,无需尝试即时搜索:

stuffButton.addActionListener(new StuffListener(stuffList.get(i));

...

private class StuffListener implements ActionListener {
    private final Stuff myStuff;
    public StuffListener(Stuff stuff) {
        this.myStuff = stuff;
    }

    public void actionPerformed(ActionEvent e) {
        subtotalTextF.setText(String.valueOf(myStuff.getPrice()));
    }
}

请注意,您可以使用 lambda 以更少的代码完成此操作,但我认为这是解释逻辑的最清晰方式,这两种方式都是相同的。

附带说明一下,根据您发布的代码,它只获得最后一个按钮的原因是因为您正在与 stuffButton 进行比较,这与您之后的最后一个实例相比没有变化初始化循环完成。