# "Button" auf List erstellen



## joh91 (11. Jul 2010)

Hallo liebe Forenmitglieder,

ich habe ein kleines Problem, wahscheinlich ein Verständnisproblem,
mit einem MIDlet, dass ich gerade für mein Handy programmiere.
Ich hoffe, dass Ihr mir ein wenig behilflich sein könnt...

Zuvor sollte ich vielleicht erwähnen, dass ich in diesem Gebiet noch relativ neu bin,
zumindest was J2ME betrifft.

Also zum Programm (wirklich weit bin ich noch nicht gekommen):

Ich habe versucht eine Liste in meinem MIDlet zu programmieren, was auch funktioniert hat, diese
wird auf meinem Handy angezeigt.
Ein Listenparameter habe ich "Photo" genannt. Auch habe ich eine Klasse "Phote" kreiert über die 
ein Bild angezeigt werden soll. Könnte mir also vielleicht jemand erklären, wie ich es schaffe, dass 
das Bild angezeigt wird wenn ich den Parameter "Photo" auf der Liste wähle?
Habe ich einfach etwas falsch gemacht oder etwas gänzlich vergessen?
Wäre über kreative Vorschläge/Verbesserungen dankbar 

Hier der Quelltext:


```
package GFS;

import java.io.IOException;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.midlet.*;

public class Programm extends MIDlet implements CommandListener
{
    Display display = Display.getDisplay(this);

    List menue = new List("Hauptmenü", List.IMPLICIT);

    Command auswahlCommand = new Command("Auswahl", Command.ITEM, 1);

    Command beendeCommand = new Command("Ende", Command.EXIT, 2);

    Command zurueckCommand = new Command("Zurück", Command.BACK, 1);

    private Form form = new Form("Bild-Editor");

    public void startApp() 
    {
        Alert willkommen = new Alert("XXX", "XXX", null, null);
        willkommen.setTimeout(5000);

         this.menue.setSelectCommand(auswahlCommand);
         this.menue.addCommand(beendeCommand);
         this.menue.addCommand(zurueckCommand);
         //this.menue.addCommand(hinzufuegenCommand);
         this.menue.setCommandListener(this);
         this.menue.append("Photo" , null);

         this.display.setCurrent(willkommen, menue);
    }

    public void pauseApp()
    {

    }

    public void destroyApp(boolean unconditional) 
    {

    }

    public void commandAction(Command c, Displayable d)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private void Image()
    {
        StringItem siPhoto = null;
        form.append("XXX");

        try 
        {
            form.append(Image.createImage("XX.png"));
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }

        form.append(siPhoto);
        display.setCurrent(form);
    }
    

    public void commandAusfuehrung(Command c, Displayable d)
    {
       if(c == auswahlCommand)
       {
            if(this.menue.getSelectedIndex() == 0)
            {
               Image();
            }

             if(this.menue.getSelectedIndex() == 1)
            {
               // Image();
            }
            
       }

        if (c == beendeCommand)
        {
            destroyApp(false);
            notifyDestroyed();
        }

        if (c == zurueckCommand)
        {
            display.setCurrent(menue);
        }


    }
}
```

Was meint Ihr? 

LG Joh

P.S: Weiß vielleicht noch jemand wieso der Button "Ende" zum Beenden des Programms nicht funktioniert?


----------



## Mobili (12. Jul 2010)

Hallo,

die Eventhandler-Funktion für die Commands ist commandAction(Command c, Displayable d)
Diese (und nur diese) wird vom System aufgerufen und da hast Du nichts drin stehen ausser der Exception.
Deine Funktion commandAusfuehrung(Command c, Displayable d) wird nie aufgerufen.
Du mußt entweder Deinen Code aus commandAusfuehrung() in die Funktion commandAction() verschieben oder in commandAction() die Funktion commandAusfuehrung() aufrufen (und die Exception entfernen).
Dann sollte die Liste und auch der "Ende" Command funktionieren.

Grüße 
Mobili


----------



## joh91 (12. Jul 2010)

Hallo, danke für die schnelle Rückmeldung...

Habe deinen Voschlag in die Tat umgesetzt und siehe da, der
Ende Button funktioniert. macht meiner Meinung nach auch jetzt viel
mehr Sinn.
Jedoch funktioniert die Liste immer noch nicht wie gewollt.
Wenn ich auf meinem Handy "Photo" anklicke, scheint die Klasse Photo
nicht in Kraft zu treten.
Besteht zwischen  


```
this.menue.append("Photo" , null);
```

und 


```
private void Image()
    {
        StringItem siPhoto = null;
        form.append("       XXX");

        try 
        {
            form.append(Image.createImage("XX.png"));
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }

        form.append(siPhoto);
        display.setCurrent(form);
    }
```

überhaupt ein zusammenhang, ruft "Photo" diese Klasse überhaupt auf?

MfG Joh


----------



## Landei (12. Jul 2010)

joh91 hat gesagt.:


> überhaupt ein zusammenhang, ruft "Photo" diese Klasse überhaupt auf?


Sowas braucht man nicht zu fragen, ein simples System.out.println("Elvis was here"); an der richtigen Stelle kann diese Frage beantworten.


----------



## Mobili (12. Jul 2010)

Hallo,

Image() ist eine Funktion und keine Klasse. Du solltest nach Möglichkeit die richtigen Begriffe verwenden.
Du erzeugst in dieser Funktion eine Variable StringItem siPhoto = null;
und fügst diese null-Referenz dann dem Form-Objekt hinzu:
form.append(siPhoto);
Das mag das Programm nicht, Du bekommst da eine NullPointerException. Daher wird die Form dann gar nicht angezeigt.
Das müsstest Du aber in Deiner Entwicklungsumgebung beim Ausführen als Fehlermeldung sehen.
Du solltest Dir unbedingt mal ansehen, wie man solche Fehler selber herausfinden kann. Das sind wichtige Grundlagen der Programmierung. Fehlermeldungen im Ausgabefenster der IDE ansehen, die Applikation im Debugger laufen lassen, zur Not System.out.println() Zeilen einfügen, aber man sollte echt in der Lage sein so etwas herauszufinden, sonst wird man beim Programmieren nicht glücklich.

Also schreib es mal so:


```
private void Image()
{
    StringItem siPhoto = new StringItem(null, "Mein Photo");        
    form.append("XXX");
    try
    {
        form.append(Image.createImage("/myphoto.png"));
    }
    catch (IOException ex)
    {
        ex.printStackTrace();
    }
    display.setCurrent(form);
    form.append(siPhoto);
}
```

Und denke beim Laden des Image auch gleich an den / vor dem Dateinamen.

Grüße
Mobili


----------

