LinkedList, ListIterator

0

Witam,
napisałem mały programik który do listy dodaje trzy słowa. Zadaniem programu jest wyswietlenie elementu listy w polu tekstowym po nacisnieciu przycisku (dalej, wstecz). Wszystko dziala ok ale do momentu gdy po kolei przeglądam listę. Gdy klikam na przycisk wstecz to muszę wcisnąć go dwa razy aby zobaczyc element poprzedni w polu. To samo jest gdy przeglądam listę do tyłu i zmieniam kierunek przeglądania.
Czy jest jakiś sposób by usunąć ten "efekt"?

package test;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Main implements ActionListener{
 
        JButton dalej = new JButton("dalej");
        JButton wstecz  = new JButton("wstecz");
        LinkedList<String> lista = new LinkedList<String>();
        JTextArea pole = new JTextArea(" ");
        ListIterator it;
    Main(){
        JFrame r = new JFrame();
        r.setLayout(new FlowLayout());r.setPreferredSize(new Dimension(250,80));
        
        lista.add("Ala");
        lista.add("Ola");
        lista.add("Ula");
        it = lista.listIterator();
        
        dalej.addActionListener(this);
        wstecz.addActionListener(this);

        r.getContentPane().add(wstecz);
        r.getContentPane().add(dalej);
        r.getContentPane().add(pole);

        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        r.pack();
        r.setVisible(true);
    }//Main
    
    
    public static void main(String[] args) {
        new Main();
    }

    public void actionPerformed(ActionEvent e) {
        Object s = e.getSource();       
        if (s.equals(dalej) && it.hasNext()){
          pole.setText((String)it.next());
        }        
        else if (s.equals(wstecz) && it.hasPrevious()){
          pole.setText((String)it.previous());
        }else{
          pole.setText("");
        }
    }//actionPerformed
}
0

Skompilowałem, uruchomiłem i nie mam objawów o których piszesz.

0

Dzieje sie tak dlatego ze iterator zwraca elementnad ktorym aktualnie "przeskakuje". Jesli jedziesz do przodu, i nagle zrobisz kroko w tyl, to "przeskakujesz" nad tym samym elementem. Jak bedziesz naciskac raz jeden przycisk, raz drugi, to element wyswietlany bedzie wciaz ten sam, poniewaz "skaczesz" iteratorem nad tym samym elementem, tyle ze raz do przodu, a raz do tylu.
Najlatwiej chyba zebys zapamietywal kierunek marszu, i jesli nagle zmieniasz, to wywolywac next / previous 2 razy, cos stylu:

private boolean forward = true;

...
...

if (s.equals(dalej) && it.hasNext()){
          pole.setText((String)it.next());
          if (!forward && it.hasNext()) {
              pole.setText((String)it.next());
          }
        } 

Ten kod troche trzeba zmienic zeby sie ladnie zachowywal we wszystkich przypadkach, ale to pozwoli ci zaczac.
Pozdrawiam.

0

Dzięki za odpowiedź.

@bogdans napisał

Skompilowałem, uruchomiłem i nie mam objawów o których piszesz.

Troche to dziwne, ale może zależne jest o używanej wersji Java?

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