ActionListener用于JTextFields数组

时间:2013-01-14 23:20:34

标签: java swing

我想根据其内容集中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);
                }
            });
        }

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

3 个答案:

答案 0 :(得分: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);
         }
    });
}

就个人而言,我建议您创建一个ActionListener子类,在其构造函数中接受JTextField。这是一种更清洁的方法,有助于减少您遇到的混淆缺陷。

答案 1 :(得分:1)

在“addActionListener”语句之前写入“final int j = i;”,然后在内部类中使用“j”。

答案 2 :(得分:1)

为什么选择ActionListener?也许我误解了你的要求,但这不会做你想要的:

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