Java ME CommandListener.

0

Witam! mam pewien problem z napisaniem aplikacji MIDlet. Mam zadanie w którym musze zmodyfikować gotowy program w taki sposób abym po wciśnieciu klawisza np "Dodaj" mógł wprowadzic np w TextBoxie pewna liczbę, która modyfikowałaby po zatwierdzeniu wielkość tablicy wyswietlanych wczesniej elementów, czyli ich ilosc.

0

W czym problem?

0

Chodzi o przykładowy głupio brzmiący program który posiada tablice stringów koszyk[], w koszyku sa owoce gruszki i jablka, na poczatku (co działa) program losowo umieszcza w tablicy koszyk[] o zadanej wielkosci [4], nazwy owoców umieszczonych w klasach Gruszka, Jabłko. Wyglada to tak ze na ekranie wyswietlaja sie losowo 4 linijki ("Jestem Jablkiem, Jestem Gruszka ...itp). Następnym krokiem jest wczytanie z klawisza (próbuje z textBoxa) nowej wartości wielkosci tablicy zeby nie byla stala rówa 4 ale mozna ja bylo zmieniac, z tym ze wartosc poczatkowa byla rowna 4.

Problem w tym, że nie wiem co mozna a czego nie mozna wykorzystac w tym celu i troche błądzę.
Próbuje z pola TextBox numeric pobrac stringa .getString, a następnie przekonwertowac go na Integera i ustawić jako nową wielkość tablicy.

wklje tutaj kod programu ktory nie zmienia tej wartosci bo zwraca wyjątek java.lang.NullPointerException:

kod:

import javax.microedition.midlet.;
import javax.microedition.lcdui.
;
import java.util.*;

/**

  • @Author Wiktor
    */
    public class OwoceMidlet extends MIDlet implements CommandListener{
    public OwoceMidlet(){

/**

int j=0;
Owoc[]koszyk = new Owoc[4];
Owoc[]owoce = new Owoc [2];
owoce[0]= new Jablko();
owoce[1]= new Gruszka();
owoce[0].PrzedstawSie();
owoce[1].PrzedstawSie();
Random rand = new Random();

for(int k=0;k<koszyk.length;k++){

koszyk[k]= owoce[j=rand.nextInt(owoce.length)];
koszyk[k].PrzedstawSie();
}

Form formatka=new Form("owoce");
formatka.append("Madre owoce przedstawiaja sie :"+"\n"+"\n");
Display ekran=Display.getDisplay(this);
ekran.setCurrent(formatka);
for(int i=0;i<koszyk.length;i++){
formatka.append(koszyk[i].PrzedstawSie()+"\n");
Display ekran1=Display.getDisplay(this);
ekran1.setCurrent(formatka);}

Command dodaj = new Command("Dodaj",Command.OK,0);
Command wyjscie = new Command("Wyjscie",Command.BACK,0);
formatka.addCommand(dodaj);
formatka.addCommand(wyjscie);
formatka.setCommandListener(this);

pole = new TextField("Wprowadz liczbe owocow w koszyku :\n","",5,TextField.NUMERIC);
formatka.append(pole);
Display ekran2 = Display.getDisplay(this);
ekran2.setCurrent(formatka);

}

public void startApp() {

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
    }
public void commandAction(Command c, Displayable s){
  if(c.getCommandType()== Command.OK){
        formatka.append(pole.getString());
      
    }
    if(c.getCommandType()== Command.BACK)
        notifyDestroyed();
    }
        private Form formatka;
        private TextField pole;
    }
0

jeszcze jeden bo dodałem konwersje Stringa na Int:

import javax.microedition.midlet.;
import javax.microedition.lcdui.
;
import java.util.*;

/**

  • @Author Wiktor
    */
    public class OwoceMidlet extends MIDlet implements CommandListener{
    public OwoceMidlet(){

/**

int j=0;
Owoc[]koszyk = new Owoc[4];
Owoc[]owoce = new Owoc [2];
owoce[0]= new Jablko();
owoce[1]= new Gruszka();
owoce[0].PrzedstawSie();
owoce[1].PrzedstawSie();
Random rand = new Random();

for(int k=0;k<koszyk.length;k++){

koszyk[k]= owoce[j=rand.nextInt(owoce.length)];
koszyk[k].PrzedstawSie();
}

Form formatka=new Form("owoce");
formatka.append("Madre owoce przedstawiaja sie :"+"\n"+"\n");
Display ekran=Display.getDisplay(this);
ekran.setCurrent(formatka);
for(int i=0;i<koszyk.length;i++){
formatka.append(koszyk[i].PrzedstawSie()+"\n");
Display ekran1=Display.getDisplay(this);
ekran1.setCurrent(formatka);}

Command dodaj = new Command("Dodaj",Command.OK,0);
Command wyjscie = new Command("Wyjscie",Command.BACK,0);
formatka.addCommand(dodaj);
formatka.addCommand(wyjscie);
formatka.setCommandListener(this);

pole = new TextField("Wprowadz liczbe owocow w koszyku :\n","",5,TextField.NUMERIC);
formatka.append(pole);
Display ekran2 = Display.getDisplay(this);
ekran2.setCurrent(formatka);

}

public void startApp() {

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
    }
public void commandAction(Command c, Displayable s){
  if(c.getCommandType()== Command.OK){
      int z=0;
        formatka.append(pole.getString());
      int liczba = Integer.parseInt(pole.getString());
      Owoc[]koszyk=new Owoc[liczba];
      koszyk[z]= koszyk[liczba];
    }
    if(c.getCommandType()== Command.BACK)
        notifyDestroyed();
    }
        private Form formatka;
        private TextField pole;
    }
0

jestem poczatkujacy więc zdaje sobie sprawe ze robie cos zle ale prosze o nakierowanie mnie na dobra droge:)

0

Na pierwszy rzut oka, kilka podstawowych bledow:
#1

Display ekran=Display.getDisplay(this);
ekran.setCurrent(formatka);
// kawalek dalej...
Display ekran1=Display.getDisplay(this);
ekran1.setCurrent(formatka);
// i dalej...
Display ekran2=Display.getDisplay(this);
ekran2.setCurrent(formatka);

Ekran jest tylko jeden. Nie potrzebujesz az tyle odwolan (ekran, ekran1, itd.). Stworz sobie jedna zmienna lokalna na poczatku metody/konstruktora i odwoluj sie do niej.

#2

for(int i=0;i<koszyk.length;i++) {
    formatka.append(koszyk[i].PrzedstawSie()+"\n");
    Display ekran1=Display.getDisplay(this);
    ekran1.setCurrent(formatka);
}

Tak nie robimy! Display.setCurrent() wywoluje sie dopiero, gdy wszystkie elementy formatki sa juz na swoim miejscu. Tymbardziej nie w petli. Wiec poprawnie bedzie:

public void startApp() {
    Form formatka = new Form("owoce");
    //formatka.append() // elementy formatki
    //formatka.addCommand() // elementy menu akcji (przyciski)
    Display.getDisplay(this).setCurrent(formatka);
}

Wklej jeszcze zrzut (stack trace) bledu, ktory dostajesz. Bedzie prosciej go znalezc. I pamietaj o wklejaniu kodu w znaczniki < code=java >< /code >

Poza tym, mozesz w dokumentacji przejrzec klasy javax.microedition.lcdui.List, javax.microedition.lcdui.Item oraz javax.microedition.lcdui.CustomItem (MIDP 2.0).

1 użytkowników online, w tym zalogowanych: 0, gości: 1