Avatar billede rbuus Nybegynder
05. december 2001 - 17:26 Der er 14 kommentarer og
1 løsning

Fejl ved brug af ListIterator og setEnabled()

Jeg har en grænseflade, hvorpå jeg har oprettet en næste og tilbage knap.

Mine objekter er lagt i en arrayListe, og jeg anvender en ListIterator til at \"køre\" frem og tilbage i min arrayListe.

Min næste og tilbage knapper har jeg sat til at blive inaktive, når jeg kommer til det første og sidste objekt i arrayliste.

Problemet er, at når jeg f.eks. når det sidste element i listen, bliver næste knappen inaktiv(fint nok), men når jeg så vil tilbage igen, skal jeg trykke to gange på tilbage knappen for at få hentet det foregående element frem. En for at gøre næste-knappen aktiv igen, og en gang for at hente det nye element.

Hvorfor er det kun tilfældet i enderne af listen, og ikke når jeg ellers bare søger frem og tilbage i listen.

Håber, at problemet er forståeligt..

Eks. på næste knappen:

//variabler oprettes
private List kunder = new ArrayList();

    private int i = 0;

    private int j = 1;

//henter den næste kunde i listen
public Kunde næsteKunde() {
    ListIterator it = kunder.listIterator(j);    if(it.hasNext()) {
      i++;
      j++;
    //System.out.println(j);
    return (Kunde)it.next();
    }
    else   
    throw (new NoSuchElementException());
}
//checker om kunden er den sidste i listen
public boolean checkNæste() {
        if (j == kunder.size()) {
            return true;
        }
        else
            return false;
       
    }

//kaldes ved tryk på næste-knappen
else if (e.getSource() == NÆSTE) {
    Kunde k = liste.næsteKunde();
    tNr.setText(k.hentNummer());
    tNavn.setText(k.hentNavn());
    tTlfNr.setText(k.hentTelefon());
    TILBAGE.setEnabled(true);
    if (liste.checkNæste())
      NÆSTE.setEnabled(false);
}
//kaldes ved tryk på tilbage-knappen
else if (e.getSource() == TILBAGE) {
    Kunde k = liste.tilbageKunde();
    tNr.setText(k.hentNummer());
    tNavn.setText(k.hentNavn());
    tTlfNr.setText(k.hentTelefon());
    NÆSTE.setEnabled(true);
    if (liste.checkTilbage())
        TILBAGE.setEnabled(false);
}
       
Avatar billede carstenknudsen Nybegynder
05. december 2001 - 17:38 #1
Du kunne gøre det samme uden en iterator
idet en enkelt int kunne udpege det aktive
element. Så skal din NÆSTE og TILBAGE
bare inkrementere/dekrementere din int.
I din kode bruger du ikke iteratoren.
Det der går galt i din kode er formentlig
at når du når til det sidste element \"peger\"
du for langt, og når du så går en tilbage
peger du på det sidste istedet for det
næstsidste element.
Avatar billede rbuus Nybegynder
05. december 2001 - 17:46 #2
Hvad mener du med, at jeg ikke bruger iteratoren??

Jeg har også prøvet, at skrive min tæller ud, og den viser det den skal, men det er bare der samme kundeobjekt som hentes frem.
Avatar billede greybeard Nybegynder
05. december 2001 - 18:10 #3
Prøv det her istedet

//variabler oprettes
private List kunder = new ArrayList();

    ListIterator it = kunder.listIterator();   


//henter den næste kunde i listen
public Kunde næsteKunde() {
    if(it.hasNext()) {
    return (Kunde)it.next();
    }
    else   
    throw (new NoSuchElementException());
}
//checker om kunden er den sidste i listen
public boolean checkNæste() {
        if (it.hasNext()) {
            return true;
        }
        else
            return false;
       
    }
public Kunde forrigeKunde() {
    if(it.hasPrevious()) {
    return (Kunde)it.previous();
    }
    else   
    throw (new NoSuchElementException());
}
Avatar billede rbuus Nybegynder
05. december 2001 - 18:31 #4
greybeard >> Jeg kan ikke få det til at virke, når jeg opretter en ListIterator som en lokal variabel. Jeg har prøvet dette tidligere, og da det ikke virkede oprettede jeg den inde i selve metoderne. Kan jeg ikke stadig oprette den inde i selve metoderne, og så bare ændre det andet??

Hvis jeg opretter it, som lokal variabel, kan jeg ikke få data frem i textField.
Avatar billede greybeard Nybegynder
05. december 2001 - 18:38 #5
Du skal erklære den i klassen
private ListIterator it = null;
Når du så har lavet kundelisten færdig, laver du iteratoren.
it = kunder.listIterator();
 
Avatar billede rbuus Nybegynder
05. december 2001 - 18:56 #6
greybeard>> Det går nu allerede gjalt, når jeg skal hente min første kunde ind. Så jeg kan ikke få checket det andet nu virker. Når jeg har lavet det andet, som du skrev, skal der så også laves noget om i nedenstående metode??

public Kunde åbenKunde() {
  if (kunder.size() == 0)
    throw (new IllegalArgumentException());
    Kunde k = (Kunde)kunder.get(0);
    return k;
}
Avatar billede greybeard Nybegynder
05. december 2001 - 19:10 #7
Hvad bruger du den metode til?
Den vil altid returnere den samme (1. i listen) kunde. Brug næsteKunde i stedet. Også til den 1.
Når du lige har fået ListIteratoren fra kunder, vil next() altid give den 1.
Er der kunder i Listen?
Avatar billede greybeard Nybegynder
05. december 2001 - 19:42 #8
Der er en \'fejl\' i Iteratoren.
Hvis du kalder skiftevis next() og previous(), får du det samme element:-)
Det er i hvert fald en besyndelig opførsel
Avatar billede rbuus Nybegynder
05. december 2001 - 19:44 #9
greybeard>> Ja, der er kunder i listen.

Ja, det er selvfølgelig rigtigt, jeg kan bare nøjes med at kalde næsteKunde() inde i ÅEBN.
Men problemet er nu, at jeg ikke kan hente den næste kunde frem, når jeg kalder næsteKunde() inde i NÆSTE.
Avatar billede greybeard Nybegynder
05. december 2001 - 19:45 #10
Det er åbenbart ikke en fejl   
/**
    * Returns the next element in the list.  This method may be called
    * repeatedly to iterate through the list, or intermixed with calls to
    * previous to go back and forth.  (Note that alternating calls
    * to next and previous will return the same element
    * repeatedly.)
    *
    * @return the next element in the list.
    * @exception NoSuchElementException if the iteration has no next element.
    */
Avatar billede rbuus Nybegynder
05. december 2001 - 19:46 #11
greybeard>> Fejl i Iteratoren, hvad skal det sige??
Avatar billede greybeard Nybegynder
05. december 2001 - 19:48 #12
Se kommentaren fra sun
Avatar billede rbuus Nybegynder
05. december 2001 - 19:53 #13
Vil det sige, at jeg ikke kan bruge denne Iterator??

Avatar billede greybeard Nybegynder
05. december 2001 - 19:57 #14
Du kan jo holde styr på hvilken af metoderne, du har brugt sidst, og så kalde den anden to gange, før du returnerer
Avatar billede rbuus Nybegynder
06. december 2001 - 00:16 #15
Jeg har droppet det med Iteratoren, det fungerede ikke rigtig..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester