Java Micro: Hello World

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Der Code für eine einfache Ausgabe ist nicht ganz so simpel wie für ein standardmäßiges Java Programm, da die Ausgabemöglichkeit nur graphisch über das Display und nicht wie gewöhnlich über eine einfache Console erfolgt.

Beispiel 1 - Hello World[Bearbeiten]

Schauen wir uns nun mal den Code für das 'Hello World'-MIDlet an, um diesen anschließend zu besprechen:

 package wikibooks.java.introduction;
 import javax.microedition.midlet.MIDlet;
 import javax.microedition.lcdui.Display;
 import javax.microedition.lcdui.TextBox;
  
 public class HelloWorldMIDlet extends MIDlet {
    private Display display = null;
    private TextBox textbox = null;
    public HelloWorldMIDlet() {
       textbox = new TextBox("", "Hello World", 20, 0);
    }
    public void startApp() {
       display = Display.getDisplay(this);
       display.setCurrent(textbox);     
    }
    public void pauseApp() {}
    public void destroyApp(boolean unconditional) {}
 }

Das Konzept ist denkbar einfach:
Nach der Initialisierung des MIDlets, die wie üblich im Konstruktor der Klasse erfolgt wird die Methode startApp selbstständig aufgerufen. Die Textbox, die hier zu Anfang initialisiert wird, ist ein vordefiniertes Element aus dem J2ME-Framework und abgeleitet von der Klasse javax.microedition.lcdui.Screen und daher auch direkt am Display darstellbar. Nachdem wir nun wissen, was wir darstellen wollen, können wir uns auch an die Arbeit machen das zu tun. Durch die Zeile 17 bekommen wir Zugriff auf das Display, dass uns zur Verfügung gestellt wird, um darauf in der folgenden Zeile die bereits erstellte Textbox anzeigen zu lassen.

Nun könnte dem geschulten Auge auffallen, dass wir keine Möglichkeit zum Beenden des Programms implementiert haben. Das stimmt, macht aber üblicherweise keine Probleme, da dies normalerweise vom Betriebssystem bereitgestellt wird. Dies steht jedoch in keiner Spezifikation, also werden wir dem gleich mit einem erweitertem Beispiel nachhelfen.

Beispiel 2 - Hello World mit Exit-Funktion[Bearbeiten]

 package wikibooks.java.introduction;
 import javax.microedition.midlet.MIDlet;
 import javax.microedition.lcdui.*;
  
 public class HelloWorldMIDlet extends MIDlet implements CommandListener {
   private Command exitCommand = null;
   private Display display = null;
   private TextBox textbox = null;
   public HelloWorldMIDlet() {
     exitCommand = new Command("Exit",Command.EXIT,1);
     textbox = new TextBox("", "Hello World", 20, 0);
     textbox.addCommand(exitCommand);
     textbox.setCommandListener(this);  
   }
   public void startApp() {
     display = Display.getDisplay(this);
     display.setCurrent(textbox);     
   }
   public void pauseApp() {}
   public void destroyApp(boolean unconditional) {}
   public void commandAction(Command c, Displayable d) {
     if(c == exitCommand)
       notifyDestroyed();
   }
 }

Wir haben nun unserem Projekt ein Command hinzugefügt, mit dessen Hilfe wir das Programm beenden können. Das Interface CommandListener ist in etwa gleichbedeutend mit dem ActionListener aus Java SE. Bei der Implementierung des Interfaces muss die Methode commandAction(Command c, Displayable d) ebenfalls implementiert werden. Wird ein Command ausgeführt, führt der Listener diese Methode aus und übergibt das Command und ein Erbe der Klasse Displayable. Die übergebenen Objekte ermöglichen dann zu unterscheiden, welches Kommando ausgeführt wurde. Das Objekt Displayable trägt die Information darüber, was gerade auf dem Display angezeigt wird. In den Zeilen 18-21 wird das Command initialisiert, der Textbox hinzugefügt und der Textbox gesagt, dass sie Aktionen des Commands an unser MIDlet (als CommandListener) schicken soll. Dies geschieht dann in Folge eines Aufrufs von commandAction, wo auf das entsprechende Command hin überprüft wird und bei Bedarf das Programm mit Zeile 37 beendet wird. Geübte Java-Programmierer werden sich an den Aufruf von System.exit(0) erinnern, der auch hier möglich ist, jedoch wird damit das Programm sofort beendet ohne Aufruf von destroyApp. In unserem Fall würde das zwar keinen Unterschied machen, wäre aber kein guter Programmier-Stil und ist daher abzulehnen.