Metodo nao funciona, me ajudem

Fiz um array de jTextfields, e estou tentando fazer um metodo paque que quando um campo mudar de cor qunado estiver selecionado, mas nao esta funcionando ta dando o seghuinte erros “local variable tf is accessed from within inner class: needs to be declared final” . alguem sabe e pode me ajudar a resolver isso, ou teria alguma outra sugestao, senao terei q fazer um metodo para cada campo, e sao muitos

 // array de jTextfields
    public JTextField [] campos(){
         JTextField[] tf = {ttf1,ttf2,ttf3};
    return tf;     
    }
    
    // metodo para mudar de cor os textFields
    public void teste (){
        JTextField [] tf = campos();
        for(int i=0 ; i<tf.length ; i++)
            tf[i].addFocusListener(new FocusListener() {
                public final void focusGained(FocusEvent e) {
                    tf[i].setBackground(Color.BLUE);
                }
                public void focusLost(FocusEvent e) {
                    tf[i].setBackground(Color.red);
                }
            });
        
    }

declare final como o compilador pediu

final JTextField[] tf = {ttf1,ttf2,ttf3};

[quote=cu_ringa]declare final como o compilador pediu

final JTextField[] tf = {ttf1,ttf2,ttf3}; [/quote]

Acho que tem que declarar como final a variável tf que está no método teste() e não a que está no método campos().

 public void teste (){
     [color=red][b]final[/b][/color] JTextField [] tf = campos();
     for(int i=0 ; i&lt;tf.length ; i++)
         tf[i].addFocusListener(new FocusListener() {
             public final void focusGained(FocusEvent e) {
                 tf[i].setBackground(Color.BLUE);
             }
             public void focusLost(FocusEvent e) {
                 tf[i].setBackground(Color.red);
             }
         });
     
 }

>

declarei como final, mas continua o mesmo erro

public void teste (){

   [b]final [/b]JTextField [] tf = campos();
    for(int i=0 ; i<tf.length ; i++)
        tf[i].addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
                tf[i].setBackground(Color.BLUE);
            }
            public void focusLost(FocusEvent e) {
                tf[i].setBackground(Color.red);
            }
        });
    
}