Это не имеет ничего общего с Swing, вообще ничего.Вы должны показать свой код, который имеет пример этого, но, вероятно, вы используете внутренний класс, возможно, анонимный внутренний класс, и если вы используете их и пытаетесь использовать переменные внутри внутреннего класса, которые являются локальными для включающего метода (илидругой блок (например, конструктор), тогда вам необходимо сделать эти переменные окончательными или преобразовать их в поля класса.Опять же, это требование Java , а не требование Swing .
Пример Swing:
public MyConstructor() {
final int localIntVar = 3; // this must be final
myJButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// because you use the local variable inside of an anon inner class
// not because this is a Swing application
System.out.println("localIntVar is " + localIntVar);
}
});
}
и пример без Swing:
public void myMethod() {
final String foo = "Hello"; // again it must be final if used in
// an anon inner class
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(foo);
try {
Thread.sleep(1000);
} catch (Exception e) {}
}
}
}).start();
}
Существует несколько приемов, позволяющих избежать этого:
- Повышение переменной до поля класса, предоставляя ему область видимости класса.
- Иметь анонимный внутренний классвызовите метод внешнего класса.Но тогда переменная все равно должна иметь область видимости класса.
Edit 2 Anthony Accioly опубликовал ответ с отличной ссылкой, но затем по неизвестным причинам удалил свой ответ.Я хотел бы опубликовать его ссылку здесь, но хотел бы, чтобы он снова открыл свой ответ.
Невозможно сослаться на непоследнюю переменную внутри внутреннего класса, определенного в другом методе