pieni ongelma

selitystä kaivataan

Eli kirjoittelin J2ME kirjasta tuollaisen esimerkin. Käytössä Netbeans.

Herjasi alkuun jo heti tuota "impelements CommandListener". Tuolle kohta koodiin tuli virheilmoitus "abstract jotain". Klikkasin sitä ja tuolla alhaalla oleva CommandListener osio muuttui automaattisesti tuollaiseksi Exception koodiksi. Ja IDE ei harjannut enää mitään. Ja Exit, more ja anymore ei tietenkään toimineet, heitti Exceptionit.

Kirjoitin uudestaan nuo public void commandAction koodit. Nytpä ei enää herjannutkaan tuosta Implements CommandListener:sta ja koodi toimi kaikinpuolin.

Nyt herää aloittelevan java opiskelijan päässä sellainen kysymys ETTÄ MITÄ VITTUA? Olenkeko vetänyt liikaa kinkkua/torttua vai liian vähän?



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

/**
* @author "nimetön opiskelija" 24.12.2008
*/
public class HelloCommand extends MIDlet implements CommandListener {

private Display display;
private Form form;

private Command ExitCmd, MoreCmd, AnyMoreCmd;

private StringItem nameLabel;
private TextField nameField;

public HelloCommand() {

ExitCmd=new Command("Exit",Command.EXIT,1);
MoreCmd=new Command("More",Command.SCREEN,2);
AnyMoreCmd=new Command("AnyMore",Command.SCREEN,2);


nameLabel=new StringItem("Name", "");
nameField=new TextField("","",10,TextField.ANY);

form=new Form("HelloCommand Midletti");
form.append(nameLabel);
form.append(nameField);

form.addCommand(MoreCmd);
form.addCommand(AnyMoreCmd);
form.addCommand(ExitCmd);
form.setCommandListener((CommandListener) this);

}

public void startApp() {
display=Display.getDisplay(this);
display.setCurrent(form);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
display.setCurrent(null);
notifyDestroyed();
}

public void CommandAction(Command c, Displayable d ) { /**/
if(c==ExitCmd) {
System.out.println("Exit key pressed");
destroyApp(false);
notifyDestroyed();

}

if(c==MoreCmd) {
form.append("You want more?\n");
System.out.println("More key pressed");

}

if(c==AnyMoreCmd) {
form.append("You want any more?\n");
System.out.println("AnyMore key pressed");

}

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

public void commandAction(Command c, Displayable d) {

if(c==ExitCmd){
System.out.println("Exit painettu");
destroyApp(false);
notifyDestroyed();
}

if(c==MoreCmd){
form.append("More");
System.out.println("More painettu");
}

if(c==AnyMoreCmd){
form.append("AnyMore");
System.out.println("AnyMore painettu");
}

}
}

4

632

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • vitun ärsyttävää

      mikähän lie vika?

      Nyt tein kuitnekin niin että klikkasin samalla lailla jolloin ohjelma teki itse sen public void commandAction( ) ja lisäsin ne omat romut sinne sisään. ja toimii

      Mutta ei kait tuon noin pitäisi mennä?

      • if-else

        En tiedä tuosta Netbeansista tai J2ME:stä. Herää kuitenkin kysymys, että oletko varmasti kirjoittanut kaikki oikein (eli isot ja pienet kirjaimet) kun olet käsin ensin tehnyt, ja oletko silloin lisännyt myös tarvittavat import lauseet koodin alkuun? Onko kääntäjä näyttänyt muitakin virheitä kuin se mistä kerroit?

        Toisaalta jos lähdekoodi ei tekstien puolesta ole miksikään muuttunut, niin kysymys on varmasti jostakin NetBeansin projekti asetuksista jotka tuo toiminto käy samalla säätämässä kuntoon kun lisää ne muutamat rivit.


    • jaded83

      Perus dokumentaatiot: http://java.sun.com/javame/reference/apis.jsp#api


      NetBeans:ssa Alt Insert - autom. koodin syöttö, Alt Enter - myös hyödyllinen, Ctrl R - luokkien, metodien, muuttujien uud.nimeäminen (kts. refactoring).

      Esimerkki luokka jonka väkersin pari vuotta sitte (sisältää luokkia joita en ny jaksa pastee). Laitan sen ny, jos se vois auttaa jotenkin.



      package muistio;

      import java.util.*;
      import javax.microedition.lcdui.*;
      import javax.microedition.midlet.MIDlet;
      import javax.microedition.rms.*;
      import muistio.comp.FullTextBox;
      import muistio.data.Muistio;
      import muistio.io.MuistioKanta;
      import muistio.util.Parsija;

      public class MuistioLista extends MIDlet implements CommandListener {
         private Command exitCommand;
         private Command newCommand;
         private Command deleteCommand;
         private Command editCommand;
         private Command showCommand;
         private Command saveCommand;
         private Command backCommand;
         private Command sendCommand;
         private Command clearDBCommand;
         private Display display;
         /*KUN KÄYTTÄJÄ HALUAA MUOKATA MUISTIOSSA OLEMASSA OLEVAA KOHDETTA, SEN LISTA
          *INDEKSI TALLETETAAN TÄHÄN MUUTTUJAAN*/
         private int editingIndex = -1;
         /*MAHDOLLISTEN VIRHEIDEN NÄYTTÖÖN*/
         private Alert alert;
         /*KÄYTTÖLIITTYMÄN LISTA NÄKYMÄ MUISTION KOHTEISTA*/
         private List memoList;
         
         /*MUISTION KANTA*/
         protected static MuistioKanta db;
         
         public MuistioLista() {
            display = Display.getDisplay(this);
            exitCommand = new Command("Exit", Command.EXIT, 2);
            newCommand = new Command("New", Command.SCREEN, 1);
            deleteCommand = new Command("Delete", Command.ITEM, 1);
            editCommand = new Command("Edit", Command.ITEM, 1);
            showCommand = new Command("Show", Command.ITEM, 1);
            saveCommand = new Command("Save", Command.SCREEN, 1);
            sendCommand = new Command("Send", Command.SCREEN, 1);
            backCommand = new Command("Back", Command.BACK, 2);
            clearDBCommand = new Command("Clear DB", Command.SCREEN, 1);
         }
         
         public void startApp() {
            alert = new Alert("Ohjelma virhe!");
            memoList = new List("Muistiolista", List.IMPLICIT);
            alert.setTimeout(5000);
            alert.setType(AlertType.ERROR);
            
            alert.addCommand(backCommand);
            memoList.addCommand(exitCommand);
            memoList.addCommand(newCommand);
            memoList.addCommand(deleteCommand);
            memoList.addCommand(editCommand);
            memoList.addCommand(sendCommand);
            memoList.addCommand(clearDBCommand);
            memoList.setSelectCommand(showCommand);
            alert.setCommandListener(this);
            memoList.setCommandListener(this);
            
            display.setCurrent(memoList);
            initialize();
         }
         
         /*
          * Poistuttaessa ohjelmasta suljetaan tietokanta.
          */
         public void destroyApp(boolean unconditional) {
            if(unconditional) {
               try {
                  db.close();
               }catch(RecordStoreException e) {
                  System.out.println(e);
               }
            }
         }
         
         public void pauseApp() {
            
         }
         
         /*
          * Luodaan / haetaan tietokanta muistioille. Alustetaan lista kannassa jo
          * olemassaolevilla muistio tiedoilla.
          */
         private void initialize() {
            try {
               db = new MuistioKanta(Muistio.class, "memo_db");
            }catch(Exception e) {
               System.out.println(e);
               alert.setString(e.toString());
               display.setCurrent(alert);
               return;
            }
            Enumeration e = db.getAllObjects();
            while(e.hasMoreElements()) {
               Muistio memo = (Muistio)e.nextElement();
               String date = Parsija.formatDate(memo.getDate(), Parsija.FORMAT_DATE);
               memoList.append(new String(date " - " memo.getHeadline()), null);
            }
         }
         
         private FullTextBox createMemoBox(Muistio memo) {
            FullTextBox memoBox = memoBox = new FullTextBox(display);
            memoBox.setTitle(memo.getHeadline());
            memoBox.setText(memo.getMemo());
            memoBox.addCommand(backCommand);
            memoBox.addCommand(sendCommand);
            memoBox.setCommandListener(this);
            return memoBox;
         }
         
         private MuistioLomake createMemoForm() {
            MuistioLomake memoForm = new MuistioLomake(new Muistio("", ""));
            setMemoFormCommands(memoForm);
            return memoForm;
         }
         
         private MuistioLomake buildMemoForm(int listIndex) {
            MuistioLomake memoForm = null;
            if(listIndex != -1) {
               try {
                  Muistio memo = (Muistio)db.getObject(listIndex);
                  memoForm = new MuistioLomake(memo);
                  setMemoFormCommands(memoForm);
                  editingIndex = listIndex;
               }catch(Exception e) {
                  System.out.println(e);
                  alert.setString(e.toString());
                  display.setCurrent(alert);
               }
            }
            return memoForm;
         }
         
         private void setMemoFormCommands(MuistioLomake memoForm) {
            memoForm.addCommand(saveCommand);
            memoForm.addCommand(backCommand);
            memoForm.setCommandListener(this);
         }
         
         private MuistioLahete createNewMemoSend(int listIndex) {
            MuistioLahete memoSend = null;
            if(listIndex != -1) {
               try {
                  Muistio memo = (Muistio)db.getObject(listIndex);
                  memoSend = new MuistioLahete(memo, "Muistion lähetys", display);
                  memoSend.addCommand(sendCommand);
                  memoSend.addCommand(backCommand);
                  memoSend.setCommandListener(this);
               }catch(Exception e) {
                  System.out.println(e);
                  alert.setString(e.toString());
                  display.setCurrent(alert);
               }
            }
            return memoSend;
         }
         
         public void commandAction(Command c, Displayable d) {
            if(c == exitCommand) {
               this.destroyApp(true);
               this.notifyDestroyed();
            /*TAKAISIN KÄSKY AINA PÄÄIKKUNAAN*/
            }else if(c == backCommand) {
               display.setCurrent(memoList);
            /*TUODAAN NÄYTÖLLE UUSI MUISTIOLOMAKE*/
            }else if(c == newCommand) {
               MuistioLomake memoForm = createMemoForm();
               display.setCurrent(memoForm);
               editingIndex = -1;
            /*TALLENNETAAN MUISTIO*/
            }else if(c == saveCommand) {
               MuistioLomake memoForm = null;
               try {
                  memoForm = (MuistioLomake)display.getCurrent();
               }catch(ClassCastException e) {
                  System.out.println(e);
                  return;
               }
               if(!memoForm.isFilled()) {
                  alert.setString("Tiedot vajanaisia!");
                  setMemoFormCommands(memoForm);
                  display.setCurrent(alert, memoForm);
                  return;
               }
               /*JOS MUISTIO ON UUSI*/
               if(editingIndex == -1) {
                  try {
                     Muistio memo = memoForm.getMemo();
                     db.store(memo);
                     String date = Parsija.formatDate(memo.getDate(), Parsija.FORMAT_DATE);
                     memoList.append(new String(date " - " memo.getHeadline()), null);
                     display.setCurrent(memoList);
                  }catch(Exception e) {
                     System.out.println(e);
                     alert.setString(e.toString());
                     display.setCurrent(alert);
                  }
               }
               /*JOS MUISTIO OLI JO OLEMASSA JA SITÄ MUOKATTIIN (päivämäärän asetus)*/
               else {
                  try {
                     Muistio memo = memoForm.getMemo();
                     memo.setDate(new Date(System.currentTimeMillis()));
                     
                     db.updateObject(editingIndex, memo);
                     String date = Parsija.formatDate(memo.getDate(), Parsija.FORMAT_DATE);
                     memoList.set(editingIndex, new String(date " - " memo.getHeadline()), null);
                     display.setCurrent(memoList);
                     editingIndex = -1;
                  }catch(Exception e) {
                     System.out.println(e);
                     alert.setString(e.toString());
                     display.setCurrent(alert);
                  }
               }
            /*POISTETAAN MUISTIO LISTAN INDEKSIN MUKAAN*/
            }else if(c == deleteCommand) {
               int index = memoList.getSelectedIndex();
               if(index != -1) {
                  try {
                     db.deleteObject(index);
                     memoList.delete(index);
                  }catch(RecordStoreException e) {
                     System.out.println(e);
                     alert.setString(e.toString());
                     display.setCurrent(alert);
                  }
               }
            /*EDITOIDAAN OLEMASSA OLEVAA MUISTIOTA LISTAN INDEKSIN MUKAAN*/
            }else if(c == editCommand) {
               MuistioLomake memoForm = null;
               if((memoForm = buildMemoForm(memoList.getSelectedIndex())) != null)
                  display.setCurrent(memoForm);
            /*NÄYTETÄÄN VAIN MUISTION MERKINTÄ LISTAN INDEKSIN MUKAAN, EI MUUTA*/
            }else if(c == showCommand) {
               int index = memoList.getSelectedIndex();
               if(index != -1 ) {
                  try {
                     Muistio memo = (Muistio)db.getObject(index);
                     display.setCurrent(createMemoBox(memo));
                  }catch(Exception e) {
                     System.out.println(e);
                     alert.setString(e.toString());
                     display.setCurrent(alert);
                  }
               }
            /*LÄHETETÄÄN VIESTI JOS LÄHETELOMAKE ON NÄYTÖLLÄ, MUUTOIN LUODAAN UUSI LÄHETELOMAKE*/
            }else if(c == sendCommand) {
               MuistioLahete memoSend = null;
               try {
                  memoSend = (MuistioLahete)display.getCurrent();
                  memoSend.sendMessage();
               }catch(ClassCastException e) {
                  memoSend = createNewMemoSend(memoList.getSelectedIndex());
                  if(memoSend != null)
                     display.setCurrent(memoSend);
               }
            /*TYHJENNETÄÄN MUISTIOLISTA JA -KANTA*/
            }else if(c == clearDBCommand) {
               try {
                  db.clear();
                  memoList.deleteAll();
               }catch(RecordStoreException e) {
                  System.out.println(e);
                  alert.setString(e.toString());
                  display.setCurrent(alert);
               }
            }
         }
      }

      • keksa

        No herja varmaan johti siitä, että luokan määrittly kertoo luokan toteuttavan rajapinnan "ComandListerner" kaikki vaaditut metodit, koska alussa lukee implements CommandListener.

        Jos näitä ei ole toteutettu, niin siitä herja.

        abstract herja voisi olla siitä, että luokan ei tarvitse toteuttaa näitä, jos luokaksi olisi määritelty abstract, jolloin luokan perivä luokka toteuttaisi ne. Luokkaa ei oltu kuitenkaan määritelty abstractiksi.

        Lyhyesti: Jos luokka mainostaa toteuttavansa rajapinnan, niin silloin rajapinnan esittelemät metodit pitää olla toteutettuna.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Vassarina hymyilyttää vaurastuminen persujen kustannuksella

      Olen sijottanut määrätietoisesti osan Kelan tuista pörssiosakkeisiin, ja salkku on paisunut jo toiselle sadalle tuhanne
      Maailman menoa
      28
      2420
    2. Riikka runnoo: Elisalta potkut 400:lle

      Erinomaisen hallitusohjelman tavoite 100 000 työllistä lisää yksityisellä sektorilla on kohta saavutettu. Toivotaan toiv
      Maailman menoa
      60
      2292
    3. Jalankulkija kuoli. Poliisi etsii mustaa BMW Coupe -autoa, jossa on punertavat vanteet.

      Jalankulkija kuoli jäätyään auton alle Joensuussa – kuljettaja pakeni, poliisi pyytää havaintoja https://www.mtvuutiset.
      Joensuu
      75
      2045
    4. Pääseekö kuka tahansa hoitaja katselemaan kenen tahansa ihmisen terveystietoja?

      "Meeri selaili puhelinta uteliaisuuttaan ja katuu nyt – Moni hoitaja on tehnyt saman rikoksen Tuttujen ihmisten asiat k
      Maailman menoa
      68
      1804
    5. Niinistö neliraajajarrutteli Natoon liittymistä vielä sodan alettua

      Myöntää nyt itsekin, mikä jo aikaisemmin tiedettiin. Marin vei Suomen ja Ruotsin Natoon. "”Myönnän auliisti jarruttelle
      Maailman menoa
      194
      1717
    6. Kokoomus on Suomen kommunistisin puolue

      "Hallituksessa on erimielisyyttä siitä, kuinka suuri osa veronkiristyksestä hyvitetään datakeskuksille uudella erillisel
      Maailman menoa
      83
      1638
    7. Nainen rakas

      Mulle on alkanut tulla sellainen olo että meistä tulee ehkä pariskunta vielä 😌
      Ikävä
      129
      1575
    8. Pyyntö Teelle

      Voisitko nyt vaan ystävällisesti laittaa viestin?
      Ikävä
      105
      1272
    9. Pidennetään viikko 8 päiväiseksi

      Ja jätetään työpäivien määrä nykyiseen 5:een. Tuo olisi kompromissiratkaisu vellovaan keskusteluun työajan lyhentämisest
      Maailman menoa
      8
      1146
    10. Martina haluaa tasoisensa miehen

      Seiskassa juttu minkälaisen miehen Martina haluaa. Kumppanin pitää tuoda hänen herkkyytensä ja vahvuutensa esiin sekä ol
      Kotimaiset julkkisjuorut
      248
      1119
    Aihe