Wyświetlanie danych w formie tabeli w interfejsie graficznym.

0

Witam,

Mój problem dotyczy wyświetlania danych przechowywanych w kolekcjach typu:

vector, arraylist, linkedlist, hashSet, treeSet.

Treść zadania mówi, że wyświetlanie tych danych koniecznie ma się odbywać poprzez metodę refresh() w osobnej klasie. Stworzyłem interfejs graficzny przy użyciu windowbuilder'a przypisałem akcje, jednak nie wiem w jaki sposób metoda refresh ma "odświeżać" okna tabel na bieżąco tak, aby dane które wpisuję cały czas były widoczne. Poniżej zamieszczam kod ( kod nie zawiera błędów, całość działa, tylko się nie wyświetla ):

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;


public class PorownajKolekcje extends JFrame implements ActionListener {

	/**
	 * Default serial version ID
	 */
	
	private static final long serialVersionUID = 1L;
	
	static public Vector<String> vector = new Vector<String>();
	static public ArrayList<String> arraylist = new ArrayList<String>();
	static public LinkedList<String> linkedlist = new LinkedList<String>();
	static public HashSet<String> hashSet = new HashSet<String>();
	static public TreeSet<String> treeSet = new TreeSet<String>();
	
	WidokKolekcji widokvector;
	WidokKolekcji widokarraylist;
	WidokKolekcji widoklinkedlist;
	WidokKolekcji widokhashSet;
	WidokKolekcji widoktreeSet;
	
	JLabel etykieta_danych = new JLabel("Dane:");
	JTextField pole_dane = new JTextField(10);
	JButton btnDodaj = new JButton("Dodaj");
	JButton btnWyczy = new JButton("Wyczy\u015B\u0107");
	JButton btnUsu = new JButton("Usu\u0144");
	JButton btnSortuj = new JButton("Sortuj");
	JButton btnAutor = new JButton("Autor");
	
	/**
	 * Metoda odpowiadajaca za uruchamianie aplikacji.
	 */
	
	public static void main(String[] args) {
		new PorownajKolekcje();
	}

	/**
	 * Tworzenie ramki i wszystkich pol w niej umieszczonych (Konstruktor).
	 */
	
	PorownajKolekcje() {
		super("Realizacja zadania pierwszego - Kolekcje");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(600, 500);

		JPanel panel = new JPanel();
		panel.add(etykieta_danych);
		panel.add(pole_dane);
		btnDodaj.addActionListener(this);
		panel.add(btnDodaj);

		btnUsu.addActionListener(this);
		panel.add(btnUsu);

		btnWyczy.addActionListener(this);
		panel.add(btnWyczy);
		
		btnSortuj.addActionListener(this);
		panel.add(btnSortuj);

		btnAutor.addActionListener(this);
		panel.add(btnAutor);
		
		widokvector = new WidokKolekcji(150, 200, "vector:");
		panel.add(widokvector);

		widokarraylist = new WidokKolekcji(150, 200, "arraylist:");
		panel.add(widokarraylist);

		widoklinkedlist = new WidokKolekcji(150, 200, "linkedlist:");
		panel.add(widoklinkedlist);

		widokhashSet = new WidokKolekcji(150, 200, "hashSet:");
		panel.add(widokhashSet);

		widoktreeSet = new WidokKolekcji(150, 200, "treeSet:");
		panel.add(widoktreeSet);

		setContentPane(panel);
		setVisible(true);
	}

	/*
	 * Metoda implementujaca wszystkie wykonywane operacje na elementach kolekcji.
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	
	@Override
	public void actionPerformed(ActionEvent evt) {
		String dane;
		Object akcja = evt.getSource();
		if (akcja == btnDodaj) {
			dane = pole_dane.getText();
			if (!dane.equals("")) {
				vector.add(dane);
				arraylist.add(dane);
				linkedlist.add(dane);
				hashSet.add(dane);
				treeSet.add(dane);
				}
			} else
				if (akcja == btnWyczy) {
					vector.clear();
					arraylist.clear();
					linkedlist.clear();
					hashSet.clear();
					treeSet.clear();
					} else
						if (akcja == btnUsu) {
							dane = pole_dane.getText();
							vector.remove(dane);
							vector.trimToSize();
							arraylist.remove(dane);
							arraylist.trimToSize();
							linkedlist.remove(dane);
							hashSet.remove(dane);
							treeSet.remove(dane);
							} else
								if (akcja == btnSortuj) {
						        	Collections.sort(vector);
						        	Collections.sort(arraylist);
						        	Collections.sort(linkedlist);
									} else
										if (akcja == btnAutor) {
											JOptionPane.showMessageDialog(this,".....jest ok");
											}
		widokvector.refresh();
		widokarraylist.refresh();
		widoklinkedlist.refresh();
		widokhashSet.refresh();
		widoktreeSet.refresh();
	}

}

/*
 * Pomocnicza klasa umozliwiajaca wyswietlanie kolekcji.
 */

class WidokKolekcji extends JScrollPane {

	private static final long serialVersionUID = 1L;
	private JTable tabela;
	private DefaultTableModel modelTabeli;
	
	WidokKolekcji(int szerokosc,int wysokosc,String opis) {
		super();
		String[] kolumny = {"Dane:"};
		modelTabeli = new DefaultTableModel(kolumny, 0);
		tabela = new JTable(modelTabeli);
		tabela.setRowSelectionAllowed(false);
		setViewportView(tabela);
		setPreferredSize(new Dimension(szerokosc, wysokosc));
		setBorder(BorderFactory.createTitledBorder(opis));
	}
	
	/*
	 * Metoda odswiezajaca zawartosc kolekcji.
	 */
	
	void refresh() {
		modelTabeli.setRowCount(0);
	}
}

Jestem początkującym programistą i możliwe że rozwiązanie jest trywialne, jednak mam chwilowy zastój i nie potrafię znaleźć na nie odpowiedzi.

Pozdrawiam.

0
modelTabeli.fireTableDataChanged();

?
setRowCount ustawia ilość wierszy, czyli w twoim przypadku czyściło tabelę?

0

Przepraszam za odpowiedź w komentarzu, to przez mój pośpiech raz jeszcze przepiszę wiadomość:

setRowCount w tym przypadku warunkuje ilość wierszy. Wcześniej próbowałem coś wymyślić do metody refresh i w pętli powiększałem ilość wyświetlanych wierszy. One są. Ale dane które wpisuję się nie wyświetlają. Sprawdzam teraz też modelTabeli.fireTableDataChanged(); zaraz zobaczę jak działa z tym.

EDIT:

modelTabeli.fireTableDataChanged(); nic nie zmienia w tym przypadku. Choć muszę przyznać, że wcześniej nie wiedziałem o tej funkcji. Widać nie czytałem oracle docs wystarczająco uważnie. Sprawdzę ten trop dokładniej.

1
modelTabeli = new DefaultTableModel(kolumny, 0);

Jak na moje to ustawiasz ilość wierszy na 0, więc jak tabela ma nie być pusta?

0

Hmm, faktycznie. Wychodzi na to, że

modelTabeli.setRowCount(0);

oraz 0 przy tworzeniu DefaultTableModel odnoszą taki sam efekt. Wiersze teraz się wyświetlają, a więc problem rozwiązany. Teraz tylko muszę odkryć dlaczego zawartość kolekcji się nie wyświetla, ale myślę, że z tym sobie poradzę. Dziękuję za pomoc :)

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