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);
                }
            });
        }

我收到错误,无法在内部类中访问局部变量。

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 回答