「for ループ」を使用して、実行時に動的に JTextField の配列を作成します。
同じまたは同等の「for ループ」を使用して、それぞれに DocumentListener を追加します。ユーザーがこれらの JTextField の内容を編集した後に実行されるはずのコードは、JTextField/DocumentListener ごとに個別に定義されているようです。
問題: ユーザー アクションの後に実行されるコードが、最後の "for ループ" ラウンドが終了したときに最後に確認された状態であるため、これは機能しません。
int counter; // this is global, because otherwise needs to be final
JTextField[] a;
void calculate() {
// ...the code sections that contains a = new JTextField[limit]; and
// a[i] = new JTextField(); is omitted...
for(counter = 0; counter < limit; counter++) {
a[counter].getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
in = a[counter].getText();
// this fails, because in the case of any text edits in any
// of the JTextFields a[0...limit-1]
// the code that executes is the one with counter = limit
}
public void removeUpdate(DocumentEvent e) {
in = a[counter].getText(); // this fails
}
public void changedUpdate(DocumentEvent e) {
in = a[counter].getText(); // obsolete
}
});
}
}