在另一个 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
进行比较,这与您之后的最后一个实例相比没有变化初始化循环完成。
我正在尝试构建一个 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
进行比较,这与您之后的最后一个实例相比没有变化初始化循环完成。