Невозможно обратиться к неконечной переменной - PullRequest
1 голос
/ 28 сентября 2010

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

Вотмой маленький код до сих пор;

myPanel = new JPanel();

JButton myButton = new JButton("create buttons");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int val = Integer.parseInt(textfield.getText());
        for(int i = 0; i < val; i++) {
            JButton button = new JButton("");
            button.setText(String.valueOf(i));
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    clickButton(i);
                }
            });
            myPanel.add(button);
            myPanel.revalidate();
        }
    }
});

Возможно, мой подход совершенно неверен.То, что я пытаюсь сделать, это;Я хочу создать набор кнопок и сказать, что когда пользователь нажимает кнопку, я хочу отобразить сообщение типа «вы нажали кнопку 4» или «вы нажали кнопку 10».

Ответы [ 3 ]

7 голосов
/ 28 сентября 2010

i должен быть последним, чтобы внутренний класс мог получить к нему доступ. Вы можете обойти это, скопировав его в конечную переменную.

Но я бы рекомендовал рефакторинг содержимого цикла for в отдельный метод, подобный этому:

for(int i = 0; i < val; i++) {
    myPanel.add(makeButton(i));
    myPanel.revalidate();
}

...

private JButton makeButton(final int index) {
    JButton button = new JButton("");
    button.setText(String.valueOf(index));
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            clickButton(index);
        }
    });

    return button;
}
1 голос
/ 28 сентября 2010

Анонимный класс может использовать только локальные переменные, объявленные как final, чтобы гарантировать, что они не изменятся.

1 голос
/ 28 сентября 2010

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

...