2012-07-25 16 views
5

Gibt es einen Grund, warum ein Button in LWUIT seinen eigenen ActionListener (über button.addActionListener) haben kann, während ein Befehl nicht?Warum haben Schaltflächen Aktions-Listener und Befehle nicht in LWUIT?

Ist die einzige Möglichkeit, einen Listener für einen bestimmten Befehl zu haben, einen ActionListener zu einem Formular hinzuzufügen und den Listener zu prüfen, für welchen Befehl das Ereignis wie folgt kam?

public void startApp() { 
    Display.init(this); 
    f = new Form("Mixed Record"); 
    exit = new Command("Exit"); 
    start = new Command("Start"); 
    Button button = new Button("Button"); 

    f.addCommand(exit); 
    f.addCommand(start); 
    f.addCommand(delete); 
    f.addComponent(button); 

    f.addCommandListener(new ActionListener() { 

     public void actionPerformed(ActionEvent ae) { 
      if (ae.getCommand().equals(exit)) { 
       //Do Exit command code 
      } else if (ae.getCommand().equals(start)) { 
       //Do Start command code 
      } 
     } 
    }); 

    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent ae) { 
      //Do button code 
     } 
    }); 

    f.show(); 
} 

Antwort

6

Nun, ich kann Ihnen nicht genau sagen, warum die Leute, die LWUIT schrieb diese Entscheidung getroffen, aber es gibt mehrere Gründe, warum es Sinn macht.

Wenn ein Formular mehrere Befehle enthält, werden diese in einem Menü gruppiert. Jedes Mal, wenn der Benutzer expandiert und das Menü dann ausblendet, wird maximal ein Befehl ausgeführt. Daher sind die Befehle konzeptionell mehr miteinander verknüpft als Buttons, zumal es nicht ungewöhnlich ist, Button-Unterklassen von einem Formular zum anderen zu verwenden.

Möglicherweise gab es auch Bedenken, dass die API des LWUIT-Formulars der LCDUI-Form in der MIDP-Spezifikation sehr ähnlich sieht.

Ich mag auch, dass der Code eine positive Folge der Entscheidung zeigt:

Sie haben bereits 2 unbenannte inneren Klassen (die Actionunterklassen) in Ihrem Code haben. Wenn jeder Befehl seinen eigenen ActionListener hätte, hätten Sie wahrscheinlich 3 unbenannte innere Klassen geschrieben. Entwickler tendieren dazu, eine Menge zu tun, obwohl Sie, wenn Sie etwas mehr Zeit mit Stack-Codeaufzeichnungen verbracht haben, die mehrere unbenannte innere Klassen enthalten, erkennen, dass es eine schlechte Übung ist, mehr als eine in jeder benannten Klasse zu haben.

+0

Ich sehe. Es macht jetzt Sinn ... (anstatt nur nervig zu sein). Danke für die ausführliche Antwort! –

+1

Der Befehl ist ein Aktionslistener (Sie können ihn ableiten und den Code in seiner actionPerformed-Methode schreiben. Das Hinzufügen eines Aktionslisteners zu einem Aktionslistener erschien daher als etwas verwirrende Indirektion. Deshalb haben wir es nicht gemacht (ursprünglicher Co-Autor) von LWUIT) –