05. december 2001 - 17:26Der 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); }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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.
//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()); }
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.
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; }
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?
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.
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. */
Jeg har droppet det med Iteratoren, det fungerede ikke rigtig..
Synes godt om
Ny brugerNybegynder
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.