2017-02-03 6 views
0

Ich benutze einen ActionListener und habe viele andere if-Anweisungen, um zu wissen, welche Taste gedrückt wird und je nach der Schaltfläche Code ausführen.Ersetze viele "else if" durch etwas anderes

Gibt es eine Möglichkeit, den Code schöner zu machen? Ich habe fast 10 andere, wenn Aussagen aufeinander folgen, gibt es etwas anderes, das ich stattdessen verwenden könnte?

Probe Code:

class BtnListener implements ActionListener { 
      @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == menu.getOpen()) { 
       getFile(); 
      } else if (e.getSource() == btnPlay) { 

      } else if (e.getSource() == btnQuit)) { 
     } 
} 

Dank.

+0

vielleicht 'switch'? – Slavik

+0

Zeigen Sie Ihren Code - das klingt nach der Art von "Schalter" wäre gut für, aber es funktioniert nicht in jeder Situation. –

+0

Sie könnten viele 'ActionListener' anstatt einer gemeinsamen verwenden. – khelwood

Antwort

1

Sie füllen Map<Object, Consumer<ActionEvent>> vor der Verwendung von Listener, z. B. im Konstruktor, wobei der Schlüssel source ist und Wert ein Consumer für Aktionsereignis ist. In Aktion führen Sie einfach Consumer by Key und rufen Sie es auf.

1

Sie können den Aktionsbefehl der Schaltfläche, und einen Schalter-case-Block:

public void actionPerformed(ActionEvent e){ 

switch(e.getActionCommand()) { 
    case "Open": 
      open(); 
      break; 
    case "Delete": 
      delete(); 
      break; 
    default : 
      break; 

    } 
} 

Natürlich haben Sie die Aktion Befehl jeder Taste zuerst setzen, wie:

openButton.setActionCommand("Open"); 

Beachten Sie, dass Schalter-Fall mit String Objekte existiert erst seit JDK 7: Strings in switch Statements

0

Sie können Anweisung stattdessen viele andere wechseln, wenn Leiter.

+0

bleiben Sie können ein Objekt nicht wechseln ... – Ainvox

0

Der beste Weg, um alle "Gemeinkosten" zu vermeiden, ist Lambda-Expressioned die Tasten. Beispiel: