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);
}
});
}
Tenta colocar a variável tf como variável global. Eu acho que isso tá acontecendo pq você tá utilizando ela dentro destes dois métodos.
Agora dever ter uma maneira mais fácil de você fazer isso.
public final void focusGained(FocusEvent e) {
tf[i].setBackground(Color.BLUE);
}
public void focusLost(FocusEvent e) {
tf[i].setBackground(Color.red);
}
ISto tá acontecendo pq vc tá tentando usar uma variável de escopo de metodo em uma inner-class… então o compilador reclama, pois pode correr o risco de referencia mudar quando a inner-class for usá-la, para resolver este problema torna a variável “tf” final… assim vc não poderá mudar a referencia da variável, e dará a garantia que o compilador quer.
As tuas possibilidades para não incorrer neste erro são:
Declarar as variáveis acessadas na InnerClass como globais;
ex.:
public class Damnit {
private JButton btn;
private int counter;
public void setup() {
btn = new JButton("damnit!");
//aqui estamos criando uma inner class anônima...
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
counter++; //global... no problem...
}
});
}
}
Colocar o modificador final na declaração dos atributos;
Ex.:
//...
public void damnit(final String parameter) {
final JButton btnOk = new JButton("Ok");
Thread t = new Thread() {
public void run() {
System.out.println("Parameter: " + parameter);
System.out.println("JButton: " + btnOk.getText());
}
}
t.start();
}
//...
No teu caso especificamente, o teu array é final, mas e os elementos dentro dele, são?!