Wyświetlanie i odświeżanie JFrame w pętli

0

Witam. Chcę wyswietlić elementy (JPanele z innymi komponentami) w moim oknie jeden pod drugim. JPanele maja tworzyć się w momencie dodawania kolejnych rekordów do Mapy (po wduszeniu przycisku). Okno ma się odświezac za kazdym razem, gdy dodaje nowy rekord. Problem jest w tym, że działa jednak kolejne elementyy wyświetla więcej niż raz - drugi rekord wyświetlony jest 2 razy, trzeci trzy i tak dalej. Coś namieszałem w pętlą - ktoś mógłby pomóc, podpowiedzieć gdzie robię błąd?
dla jasności: metoda startSwing() odpala okno; listWindow - moj JFrame, vehiclelist - Mapa

public void restRecords(){ 
        ArrayList<JPanel> label = new ArrayList<>();

        for (int i = 1; i < vehiclelist.size(); i++) {
        if (vehiclelist.size() == 1) {
                    try {
                        startSwing();
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    }
                  }  
    
            JButton details3 = new JButton();
            JPanel panel2 = new JPanel(new GridBagLayout());
            details3 = new JButton("Details");
            details3.addActionListener(this);
            JLabel name2 = new JLabel("Name: " + fullname);
            JLabel data2 = new JLabel(String.valueOf(currentdata));
            JLabel label2 = new JLabel(licname);
            label2.setIcon(new ImageIcon("images/tab.jpg"));
            label2.setFont(new Font("Verdana", Font.PLAIN, 18));
            label2.setHorizontalTextPosition(JLabel.CENTER);
            label2.setVerticalTextPosition(JLabel.CENTER);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            panel2.add(label2, gbc);
            gbc.gridx++;
            panel2.add(details3, gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            panel2.add(name2, gbc);
            gbc.gridx++;
            panel2.add(data2, gbc);
            label.add(panel2);
            buttonlist.put(details3,vehiclelist.get(licenseplate));
        }

        JPanel p = new JPanel();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = gbc.HORIZONTAL;
        gbc.weightx = 1;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        for(JPanel j:label) {
            p.add(j,gbc);
        }
        gbc.weighty = 1;
        listWindow.add(p);

        listWindow.invalidate();

        listWindow.validate();
        listWindow.repaint();
        System.out.println(vehiclelist);
    }


oraz Action Listener

 public void actionPerformed (ActionEvent e) {
if (source == button1) {
vehiclelist.put(licensePlate, vehicle);
restRecords();
}
0

Tworzenie widgetów od zera na skutek zmiany danych to jakas patologia.

Niestety, Swinga nie da się używać "bo bardzo chcę" - ale po nabraniu podstaw odwdzięczy się skutecznym programowaniem fajnych aplikacji. To naprawdę dobrze zaprojektowany framework
Swing ma bardzo ładną pracę Modeli. O ile najczęsciej popieram użycie Modeli ze wzgl na elegancję, to w tym kontekście podkreślę, ze ładnie widgety sie odświeżają

0

Wygląda na to, że problemem jest to, że zmienna i jest zainicjowana jako 1 w pętli for, a nie jako 0. W ten sposób pierwszy element listy nie jest wyświetlany. Należy zmienić inicjowanie zmiennej i z 1 na 0, tak jak pokazano poniżej:

for (int i = 0; i < vehiclelist.size(); i++) {
    // reszta kodu
}

Ponadto, jeśli Twoja mapa vehiclelist zawiera klucze, które nie są uporządkowane w sposób chronologiczny, wówczas należy użyć zamiast vehiclelist.size() metody vehiclelist.values().size() w pętli for, aby upewnić się, że wszystkie elementy zostaną wyświetlone w odpowiedniej kolejności:

for (int i = 0; i < vehiclelist.values().size(); i++) {
    // reszta kodu
}

Pamiętaj, że mapy w Javie nie są uporządkowane, więc jeśli chcesz wyświetlić elementy w kolejności, w jakiej zostały dodane, musisz użyć metod związanych z wartościami mapy.

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