2016-05-12 3 views
0

[Zunächst einmal ich diese Antwort gelesen haben, aber ich verstehe mein unterscheidet Add actionListener to a lot of JButton]In einer generischen Action zu viele JButtons oder JComponents oder JTextFields

ich eine Reihe von JTextField haben und ich brauche etwas zu tun, wenn ihre Werte sind aktualisiert. Normalerweise muss ich myAction(JTextField jt) mit allen von ihnen tun.

Momentan verwende ich diesen Code, um es zu tun, aber ich muss eine Instanz dieses Codes für jede meiner JTextField machen und ich möchte es nur einmal tun.

myJTextField1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(myJTextField1); 
     } 
    }); 
//repeat for myJTextFields-2-to-9 

Das, was ich versucht, aber es funktioniert nicht, weil jt nicht zugänglich ist.

void addListener(JTextField jt){ 
    jt.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(jt); 
     } 
    }); 
} 

Ich habe auch versucht, so etwas wie jt.addActionListener(new myListener implements ActionListener (jt){ aber ich weiß nicht wirklich, wie man so etwas.

+1

A 'DocumentListener' ist in der Regel besser als ein' ActionListener' wenn es zu einem 'JTextComponent' kommt .. –

Antwort

3

zunächst eine generische ActionListener schaffen, extrahiert die JTextField, auf dem die Aktion aus dem Ereignis eingetreten ist:

ActionListener listener = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     myAction((JTextField)e.getSource()); 
    } 
} 

oder kürzer als Lambda

ActionListener listener = e -> myAction((JTextField)e.getSource()); 

und es dann auf Ihre Textfelder registrieren:

myJTextField1.addActionListener(listener); 
myJTextField2.addActionListener(listener); 
... 

UPDATE:

Wenn Sie jedes Textfeld mit einem String-Parameter zuordnen möchten, und den Parameter auf Ihre myAction-Methode übergeben, können Sie die Parameter im Namensfeld transportieren kann:

myJTextField1.setName("param1"); 

und entpacken Sie es in der Aktionsmethode:

public void actionPerformed(ActionEvent e) { 
     JTextField tf = (JTextField)e.getSource(); 
     myAction(tf, tf.getName()); 
    } 

natürlich könnte dies auch in myAction getan werden.

+0

genial Vielen Dank – fartagaintuxedo

+0

Nur eine Frage, ob Ich musste einen anderen Parameter in 'myAction (JTextField jt)' übergeben, der dann aktualisiert wird, wie zB 'myAction (JTextField jt, String a)' kann dieser Ansatz noch funktionieren? – fartagaintuxedo

+0

Ich beabsichtige, 'String a' zu verwenden, um zu entscheiden, was in' myAction' mit einem 'case'-Operator zu tun ist. – fartagaintuxedo

2

FYI: Auch wenn die Antwort von @wero sehr gut ist, können Sie Ihre Methode ändern, damit es funktioniert.

// to be accessible form an anonymous class variable must be declared as final! 
void addListener(final JTextField jt){ 
    jt.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(jt); 
     } 
    }); 
} 
+0

Was sind die Nachteile der Deklaration der Variablen' JTextField jt' als 'final'? – fartagaintuxedo

+1

@fartagaintuxedo Variable 'jt' kann nicht in der Methode geändert werden –

+1

kann nicht in Bezug auf' jt = ... 'geändert werden, aber' jt.setText ("..") 'wird gut funktionieren – Yazan

1

Machen Sie Ihre Klasse implements ActionListener

public class myClass extends abcd implements ActionListener { 

    public void someMethod(){ 
     myJTextField1.addActionListener(this); 
     myJTextField2.addActionListener(this); 
     myJTextField3.addActionListener(this);//add more ... 
    } 

    @override 
    public void actionPerformed(ActionEvent event) { 
     JTextField target = (JTextField)event.getSource(); 
     myAction(target); 
    } 
} 
Verwandte Themen