Aktualizacja JList

0

Witam, dopiero uczę się programowania i chciałem zrobić prosty telefon z wykorzystaniem GUI, lecz napotykam na przeszkodę, otóż moja lista nie odświeża się tak jak chciałbym. Nie wiem jak ten problem rozwiązać. I jeszcze jedna kwestia, jak przekazuje ArrayList z obiektami to czy da się przekazywać od razu wartośc poszczególnych obiektów, bo jak na razie wypisuje obiekty, ale "zakodowane".

package projektjavacezary;

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class ProjektJavaCezary {

    private JFrame jFrameMain;
    private JButton jButtonZadzwon, jButtonPisz, jButtonDodaj, jButtonUsun,
            jButtonModyfikuj, jButtonZadzwonNumer;
    private JPanel jPanelMain;
    private JList<Kontakty> jListBazaKontaktow;
    private JTextField jTextFieldNumer;
    private ArrayList<Kontakty> kontakty;
    private JScrollPane jScrollPaneKontakty;
    
    ProjektJavaCezary() {
        jFrameMain = new JFrame("Telefon Komórkowy");
        jFrameMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrameMain.setSize(400, 500);
        jFrameMain.setResizable(false);
        jFrameMain.setLayout(new FlowLayout());
        
        kontakty = new ArrayList<Kontakty>();
        Kontakty kontakt = new Kontakty("Jan", "53532");
        kontakty.add(kontakt);
        kontakt = new Kontakty("piotr,", "Adam:");
        kontakty.add(kontakt);
        
        jPanelMain = new JPanel(null);    
        jButtonDodaj = new JButton("Dodaj Kontakt");
        jButtonZadzwon = new JButton("Zadzwoń");
        jButtonUsun = new JButton("Usuń Kontakt");
        jButtonModyfikuj = new JButton("Modyfikuj Kontakt");
        jButtonZadzwonNumer = new JButton("Zadzwon pod podany numer");
        jButtonPisz = new JButton("SMS");
        jTextFieldNumer = new JTextField(15);
        
        jListBazaKontaktow = new JList(kontakty.toArray());
        jListBazaKontaktow.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jScrollPaneKontakty = new JScrollPane(jListBazaKontaktow);
        jScrollPaneKontakty.setPreferredSize(new Dimension(120, 100));
        
        jScrollPaneKontakty.setBounds(10, 50, 200, 200);
        jButtonDodaj.setBounds(225, 50, 150, 50);
        jButtonZadzwon.setBounds(225, 100, 150, 50);
        jButtonUsun.setBounds(225, 150, 150, 50);
        jButtonModyfikuj.setBounds(225, 200, 150, 50);
        jButtonPisz.setBounds(225, 250, 150, 50);
        jButtonZadzwonNumer.setBounds(200, 350, 200, 50);
        jTextFieldNumer.setBounds(225, 310, 150, 30);
        
        jButtonDodaj.addActionListener(new ActionListenerDodajKontakt(jListBazaKontaktow,
                     jPanelMain, jFrameMain, kontakty, jScrollPaneKontakty));
        jButtonDodaj.addActionListener(new ActionListenerUsunKontakt(kontakty,
                     jListBazaKontaktow, jScrollPaneKontakty));
        
        jPanelMain.add(jButtonDodaj);
        jPanelMain.add(jButtonZadzwon);
        jPanelMain.add(jButtonUsun);
        jPanelMain.add(jButtonModyfikuj);
        jPanelMain.add(jButtonPisz);
        jPanelMain.add(jTextFieldNumer);
        jPanelMain.add(jButtonZadzwonNumer);
        jPanelMain.add(jScrollPaneKontakty);
        
        jFrameMain.setContentPane(jPanelMain);      
        jFrameMain.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               new ProjektJavaCezary();
            }
        });
    }
    
}


package projektjavacezary;

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

public class ActionListenerUsunKontakt implements ActionListener {
    
    private ArrayList<Kontakty> kontakty;
    private JList<Kontakty> jListBazaKontaktow;
    private JScrollPane jScrollPaneKontakty;
    
    ActionListenerUsunKontakt(ArrayList<Kontakty> kontakty, JList<Kontakty>
            jListBazaKontaktow, JScrollPane jScrollPaneKontakty) {
        this.kontakty = kontakty;
        this.jListBazaKontaktow = jListBazaKontaktow;
        this.jScrollPaneKontakty = jScrollPaneKontakty;
    }
    
    public void actionPerformed(ActionEvent ae) {
        int index;
        index = jListBazaKontaktow.getSelectedIndex();
        
        kontakty.remove(index);
        
        jListBazaKontaktow = new JList(kontakty.toArray());
        jScrollPaneKontakty = new JScrollPane(jListBazaKontaktow);
    }

}
0

Użyj mapy, możesz przypisać np imię do telefonu :)

0

Nigdy nie używałem mapy, a za bardzo czas mnie goni by się tego nauczyć. A nie wiesz co jes tnie tak z aktualizacja?

0

Wyświetlasz listę utworzoną w klasie ProjektJavaCezary, aktualizujesz listę z klasy ActionListenerUsunKontakt. JList jest komponentem graficznym, po modyfikacji warto wywołać metodę repaint.

0
Mały Lew napisał(a):

Nigdy nie używałem mapy, a za bardzo czas mnie goni by się tego nauczyć. A nie wiesz co jes tnie tak z aktualizacja?

Mapy to jedna z kolekcji i bardzo przydatne, podsyłam Ci link do dokumentacji Oracle:

https://docs.oracle.com/javase/7/docs/api/java/util/Map.html

Ew. po polskiemu :D

http://javastart.pl/static/algorytmy/struktury-danych-mapa/

0

Sprawdzałem repaint, revaildata(chyba tak sie pisze), i jeszcze jedna z funkcji jaką znalazłem na internecie. Repaint wywoływałem też na JFrameMain oraz JPanelMain lecz niestynie nie udawało, jedynym sposobem było dodanie modelu do listy, chodzi mi o DefaultModelList. Z góry dzięki za odpowiedzi.

0

Ty masz dwa błędy. Podstawowy jest ten

Wyświetlasz listę utworzoną w klasie ProjektJavaCezary, aktualizujesz listę z klasy ActionListenerUsunKontakt.

Nie ma metody revaildata, są metody validate, invalidate oraz revalidate.

0

A w jaki sposób mogę je aktualizować w ActionListnerUsun. Swojego głównego fram'a uruchamiam w taki sposób

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new ProjektJavaCezary();
                } catch (IOException ex) {
                    Logger.getLogger(ProjektJavaCezary.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(ProjektJavaCezary.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    } 

, mam przekazywać cała klasę jako argument i stworzyć nową metodę publiczna w ProjektJavaCezary która będzie przypisywać nowego ArrayList<> do JList?

1
  1. W tej instrukcji jest chyba błąd
        jButtonDodaj.addActionListener(new ActionListenerUsunKontakt(kontakty,
                     jListBazaKontaktow, jScrollPaneKontakty));

powinno być jButtonUsun. Tak czy owak zamień to na

        jButtonUsun.addActionListener(new ActionListenerUsunKontakt(this));
  1. W klasie ProjectJavaCezary dopisz netody
    public ArrayList<Kontakty> getKontakty()
    {
        return kontakty;
    }
    public JFrame getJFrameMain()
    {
        return jFrameMain;
    }
    public JList<Kontakty> getJListBazaKontaktow()
    {
        return jListBazaKontaktow;
    }
  1. Klasę ActionListenerUsunKontakt napisz tak:
import java.awt.event.*;
import javax.swing.*;
 
public class ActionListenerUsunKontakt implements ActionListener {
 
    private ProjektJavaCezary parent; 
    
    ActionListenerUsunKontakt(ProjektJavaCezary parent) {
        this.parent = parent;
    }
 
    public void actionPerformed(ActionEvent ae) {
        int index = parent.getJListBazaKontaktow().getSelectedIndex();
        if(index > -1)
        {            
            parent.getKontakty().remove(index);
            Kontakty[] tab = new Kontakty[4];
            parent.getJListBazaKontaktow().setListData(parent.getKontakty().toArray(tab));
            parent.getJFrameMain().repaint();
        }
    }
}
0

Co do 1 to jest dobrze nastawiona. A za 2 i 3 bardzo dziękuję. Temat do zamknięcia.

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