# Programm aus einem Buch funzt nicht!



## Big Masie (27. Dez 2009)

Hallo,

ich habe aus meinen Java ME Buch ein Programm nach Programmiert und es Läuft im Emulator nicht!
Zu dem Buch gab es auch eine CD mit allen projekten drauf, da habe ich dann als es nicht gefunzt hat den Quelltext kopiert und es damit versucht und es klappt auch nicht! Woran kann das liegen? hier mal der komplette Code:

[Java]
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

public class HalloWelt extends MIDlet implements CommandListener
{
    private Display display;
    private Command
                menuExit=new Command ("Verlassen", Command.EXIT,1);

    private ChoiceGroup
                cGroup=new ChoiceGroup("Auswahl", ChoiceGroup.EXCLUSIVE);
    private DateField
                dField=new DateField("Kalender", DateField.DATE);
    private Gauge
                gauge=new Gauge ("Fortschritt", true,10,2);
    private TextField
                tField=new TextField("Textfeld","...",30,TextField.ANY),
                ltField=new TextField("Textfeld","",30,TextField.UNEDITABLE);
    private Command
            menuSave=new Command("Save", Command.ITEM,1),
            menuLoad=new Command("Load",Command.ITEM,1);

    private Form f=new Form("Hallo Welt Form!");


    public HalloWelt()
    {
        cGroup.append("Äpfel",null);
        cGroup.append("Birnen",null);
        f.append(cGroup);
        f.append(dField);
        f.append(gauge);
        f.append(ltField);
        f.addCommand(menuSave);
        f.addCommand(menuLoad);
        f.addCommand(menuExit);
        f.setCommandListener(this);
    }

    private void saveTextField()
    {
        RecordStore store;
        byte[] data;

        try
        {
            store=RecordStore.openRecordStore("HalloWeltStore", true,RecordStore.AUTHMODE_PRIVATE,true);
            data=tField.getString().getBytes();
            store.setRecord(1,data,0,data.length);
            store.closeRecordStore();
        }
        catch(RecordStoreException rse)
        {
            ltField.setString(rse.toString());
        }

    }

    private void loadTextField()
    {
        RecordStore store;
        byte[] data;

        try
        {
            store=RecordStore.openRecordStore("HalloWeltStore", false);
            data=store.getRecord(1);
            store.closeRecordStore();
            ltField.setString(new String(data));
        }
        catch(RecordStoreException rse)
        {
        ltField.setString(rse.toString());
        }
    }

    public void startApp() throws MIDletStateChangeException
    {
        display =Display.getDisplay(this);
        display.setCurrent(f);
    }

    public void pauseApp()
    {
    }

    public void destroyApp(boolean unconditional) throws MIDletStateChangeException
    {
    }

    public void commandAction(Command c, Displayable s)
    {
        if(c==menuExit)
            notifyDestroyed();

        else if(c==menuSave)
            saveTextField();

        else if(c==menuLoad)
            loadTextField();

    }
}

[/Java]

beim Compilieren kommt in der Console immer das hier in rot:

Application descriptor does not declare any MIDlet. Direct execution is not allowed.

Hoffe ihr könnt mir helfen
Danke schon mal im vorraus.


----------



## Spin (27. Dez 2009)

Das kann ich dir nur empfehlen, wenn du fürs Handy Midlets verwenden willst.

gruß


----------



## CNail187 (27. Dez 2009)

Hallo!

Also der Code ist soweit in Ordnung, läuft bei mir einwandfrei mit Netbeans 6.7.1 und Sun WTK 2.5.2.
Die Probleme scheinen also eher bei deiner Umgebung zu liegen...

Gruß,
CNail


----------



## Big Masie (27. Dez 2009)

ich benutz dieses Java_ME_platform_SDK_3.0
auf der seite von sun stand das dass der nachfolger vom wtk sein soll.
Soweit find ich das auch ziemlich gut und das Programm was ich davor geschrieben hatte funzte auch in jeglicher hinsicht
woran kann das jetzt liegen? Ich hab an den einstellung ja nichts geändert


----------



## CNail187 (28. Dez 2009)

Hmm, klingt fast nach einem Problem das schon mal jemand in einem anderen Thread hier hatte. Schau doch mal unter

http://www.java-forum.org/java-2-microedition/84367-problem-beim-ausfuehren-folgendem-quelltext.html

nach meinem 2. Lösungsvorschlag!

Gruß, CNail


----------



## Big Masie (30. Dez 2009)

Ja genau das wars! Cool danke  
aber mal ehrlich wie soll den da jemand drauf kommen der gerade anfängt das zu lernen ^^ aber danke

aber gleich noch ne frage in dem textfeld was ich dort programmiert habe kann ich (jedenfalls im emulator) nichts reinschreiben woran liegt das?


----------



## CNail187 (30. Dez 2009)

Naja, also du erzeugst 2 Textfelder zeigst aber nur eines davon an. Und dieses eine (ltField) wird im Konstruktor als UNEDITABLE deklariert -> ergo ist es schreibgeschützt.

Nun hast du mehrere Möglichkeiten:

- Du zeigst das andere (tField) auch noch an: 
	
	
	
	





```
f.append(tField);
```
 Ist wahrscheinlich das beste, dann kannst du auch via saveTextField() etwas in das RecordStore reinschreiben.

- Du machst ltField von Anfang an editierbar: 
	
	
	
	





```
private TextField ltField = new TextField("Textfeld", "", 30, TextField.ANY),
```

- Du machst ltField im Nachhinein editierbar: 
	
	
	
	





```
ltField.setConstraints(TextField.ANY);
```

Gruß,
CNail


----------



## Big Masie (2. Jan 2010)

also ich hab das tField jetzt auch sichtbar gemacht und das klappt auch wunderbar nur das mit dem speichern und/oder laden klappt nicht.
Also ich tipp irgentwas ins das Feld ein geh dann auf save und dann geh ich auf load, dann müsste der doch was ich zuvor eingetippt habe in dem anderen Textfeld anzeigen oder? jedenfalls tut er das nicht, er tut überhauptnichts auch keine fehlermeldung oder so


----------



## CNail187 (2. Jan 2010)

Die Methode setRecord() funktioniert nur wenn es schon einen Datensatz mit dieser ID gibt. Beim ersten Anlegen musst du stattdessen addRecord() verwenden.

Du kannst deine saveTextField() - Methode also zum Beispiel so abändern:

anstelle von:

```
store.setRecord(1,data,0,data.length);
```

das hier:

```
if (store.getNumRecords() == 0) {
   store.addRecord(data, 0, data.length);   
} else {
   store.setRecord(1, data, 0, data.length); 
}
```

Übrigens erhälst du keine Fehlermeldungen, weil du dich auf die RecordStoreException beschränkst.
Wie man in der API-Doc http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/rms/RecordStore.html#setRecord(int, byte[], int, int) sieht, kann dabei aber noch anderes schiefgehen...
;-)

Gruß, CNail


----------



## Big Masie (2. Jan 2010)

ah ok so funzt das erstmal, jedoch nich wenn ich das programm neu starte dann läd der das nicht, is das normal, oder liegt das jetzt nur am emulator?

und was mich auch wundert is das dass laut dem Buch ja alles so klappen sollte ich versteh es nicht ... is das Buch einfach falsch oder was?


----------



## CNail187 (3. Jan 2010)

Also bei mir funktioniert es auch nach einem Neustart des Emulators. 
Was genau geht denn nicht? Das Anzeigen des alten Wertes beim Load ohne vorheriges Save?
Hast du eigentlich eine richtige IDE nebst Debugger zur Hand? Damit käme man ja schon ein Stück weiter. Für die J2ME-Entwicklung kann ich Netbeans empfehlen.


----------



## Big Masie (3. Jan 2010)

der zeigt den wert nicht an nach neustart trotz speicherns.

und ich benutze Java ME Platform SDK 3.0

Netbeans hab ich auch mal gehabt aber ich fand das ziemlich unübersichtlich vor allem haben mich diese ständigen autokomentare genervt die man nich löschen konnte und so


----------



## CNail187 (4. Jan 2010)

Ich habe das Programm jetzt spaßenshalber nochmal auf dem Emulator vom N97-SDK laufen lassen: Dieser merkt sich den alten Wert auch über einen Neustart hinweg-> liegt also eindeutig am verwendeten Emu. Keine Ahnung, ob man am WTK3 noch etwas drehen kann. 
Ist ja auch kein Beinbruch, da das Programm ja nun funktioniert.



Big Masie hat gesagt.:


> und ich benutze Java ME Platform SDK 3.0


Das war schon klar...




Big Masie hat gesagt.:


> Netbeans hab ich auch mal gehabt aber ich fand das ziemlich unübersichtlich vor allem haben mich diese ständigen autokomentare genervt die man nich löschen konnte und so


Najaaaa...

Als Alternative gibts zum Beispiel noch Eclipse und die Mobile Tools for Java.


----------



## Big Masie (5. Jan 2010)

also habs mit netbeans jetzt ma compiliert und im emu laufen lassen und da speichert der das auch nicht richtig, also obald man den neustarten den emu klappt es halt nicht mehr


----------



## CNail187 (6. Jan 2010)

Logisch: Die Wahl der Entwicklungsumgebung hat ja erst mal nichts mit dem Emulator zu tun. Du hast trotzdem noch das WTK3 im Einsatz.


----------



## Big Masie (6. Jan 2010)

Hmm nagut, aber woran liegt das dann? Sind das irgentwelche einstellungen oder was?


----------



## CNail187 (7. Jan 2010)

Einfaches Googleln führte nach 2 Minuten zu

Java ME SDK - JavaME SDK 3.0 storage capacity

und

Java ME SDK - JavaME SDK 3.0 storage issues

Du müsstest das Midlet also zuerst via Kommandozeile installieren und dann den Emulator starten.

Oder machs so wie ich (oder die Leute in den o.g. Foren) und benutze das alte WTK.


----------

