これは、Swing、全く何もして行うには何もを持っていません。その例を示すコードを表示する必要がありますが、内部クラス、おそらく匿名の内部クラスを使用している可能性があります。これらを使用し、内部クラス内の変数を囲むメソッドのローカルに使用しようとすると(またはコンストラクタなどの他のブロック)、これらの変数を最終的にするか、クラスフィールドに宣言する必要があります。これもJavaの要件であり、スウィングの要件ではありません。
スイング例:
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);
}
});
}
と非スイング例:
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();
}
これを回避するために、いくつかのトリックがあります。
- がクラスフィールドに変数を推進クラスのスコープを与えます。
- 匿名の内部クラスに外部クラスのメソッドを呼び出させます。しかし、変数には依然としてクラススコープが必要です。
編集2 アンソニーAcciolyは偉大なリンクとその答えを掲載するが、その後、未知の理由のために彼の答えを削除しました。私はここに彼のリンクを掲示したいと思いますが、彼が彼の答えを再開するのが好きです。
Cannot refer to a non-final variable inside an inner class defined in a different method
例を挙げることができますか?匿名の内部クラスで周囲のメソッドから変数を使用することについて話していますか?変数を 'final'にすることを強制するSwing自体には何もないので。 – Jesper
私はあなたが匿名の内部クラスを使用していると確信しています。 –