найти источник JButton в другом ArrayList - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь создать приложение с графическим интерфейсом, которое позволит пользователю выбрать продукт, нажав кнопку.Я храню продукты в ArrayList, а затем использую этот ArrayList и цикл for для создания необходимого количества JButton.Когда пользователь нажимает кнопку, цена этого продукта должна появиться в TextField.Моя проблема: как узнать, какая кнопка была нажата?Если бы я использовал Array of Buttons (JButton button [] = new JButton [3]), я бы нашел его в цикле: if (target.equals (button [i]))) ... Но я не могу понять, какчтобы найти его, когда я использую ArrayList продуктов для создания кнопок.Любая помощь будет принята с благодарностью.Вот мой код (я пробовал много подходов, поэтому я публикую только тот, с которого начал - он находит только последний элемент в 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() + "");
    }
}

}

1 Ответ

0 голосов
/ 23 сентября 2018

Создайте определенный класс для вашего ActionListener и дайте ему ссылку на ваш 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()));
    }
}

Обратите внимание, что вы можете выполнить это с немного меньшим количеством кода, используя лямбды, но решил, что это самый простой способ объяснить логику, которая в любом случае одинакова.

Что касается примечания, основанного на опубликованном вами коде, то причина, по которой он получает только последнюю кнопку, состоит в том, что вы сравниваете с stuffButton, который не изменяется с последнего экземпляра после цикла инициализации.сделано.

...