Сохранение данных в ArrayList из события в ItemListener - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в GUI и Swing в Java, прошу прощения, если я задал простой вопрос. Сейчас работаю над проектом простого заказа торта GUI. Я хотел создать несколько JCheckBox с al oop в зависимости от количества доступных начинок. Флажки отображаются правильно, но я не могу добавить текст CheckBox в свой массив toppingOrder.

Пытался создать еще одну строку для хранения topping.get (i), но в итоге я сохранил только мой последний элемент в topping

for (int i = 0; i < topping.size(); i++) {
            topping1 = new JCheckBox(topping.get(i));
            topping1.setName("topping" + (i+1));
            topping1.setFont(standard);
            topping1.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == 1) {
                        toppingOrder.add(topping.get(i));
                    }
                }
            });

И я получаю эту ошибку

Local variable i defined in an enclosing scope must be final or effectively final

Также меня немного смущает

topping1.setName("topping" + (i+1));

Я получил это из другого сообщения, но я не Я действительно не знаю, как это работает. Пожалуйста помоги. Спасибо!

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Этот фрагмент здесь:

topping1.setName("topping" + (i+1));

просто установит имя флажка, объединив строку «topping» с числом (например, «topping1»).

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

В качестве быстрого исправления вы можете дублировать свой счетчик и переназначать его при каждом запуске:

    for (int i = 0; i < topping.size(); i++) {
        final int temp = i;
        topping1.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == 1) {
                    toppingOrder.add(topping.get(temp));
                }
            }
        });
    }

Думаю, это сработает для вас.

0 голосов
/ 03 августа 2020
for (final int i = 0; i < topping.size(); i++)

, а для topping1.setName вы просто устанавливаете его имя на "topping1", когда i = 0, и "topping2", когда i = 1, и так далее и так далее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...