0

そのコンテンツに基づいて JTextField のコンテンツを中央に配置したいと考えています。

     for(int i=0; i<10; i++){                                   
           txtFields[i] = new JTextField(20); 

           txtFields[i].addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    txtFields[i].setHorizontalAlignment(JTextField.CENTER);
                }
            });
        }

エラーが発生しています。インナークラス内でローカル変数 i にアクセスできません。

4

3 に答える 3

4

これは、変数iが actionPerformed が呼び出されるスコープで使用できないためです。簡単な修正は、for ループのスコープで final 変数を宣言することです。

for (int i = 0; i < 10; i++) {    
    final JTextField currentField = new JTextField(20);                               
    txtFields[i] = currentField;
    txtFields[i].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             currentField.setHorizontalAlignment(JTextField.CENTER);
         }
    });
}

または:

for (int i = 0; i < 10; i++) {                             
    txtFields[i] = new JTextField(20);
    txtFields[i].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             ((JTextField) e.getSource()).setHorizontalAlignment(JTextField.CENTER);
         }
    });
}

個人的には、コンストラクターで JTextField を受け入れる ActionListener サブクラスを作成することをお勧めします。これはよりクリーンなアプローチであり、遭遇したような紛らわしい欠陥を減らすのに役立ちます。

于 2013-01-14T23:31:20.047 に答える
1

「addActionListener」ステートメントの直前に「final int j = i;」と記述し、内部クラス内で「j」を使用します。

于 2013-01-14T23:26:04.010 に答える
1

そもそもなぜ ActionListener なのですか? おそらく私はあなたの要件を誤解していますが、これはあなたが探していることをしません:

for (int i=0; i<10; i++)
{                                   
  txtFields[i] = new JTextField(20);
  txtFields[i].setHorizontalAlignment(JTextField.CENTER);
}
于 2013-01-15T16:00:45.530 に答える