Eigenes TableModel für ArrayList<String[]>

expensne

Mitglied
Hallo Leute,

hab mal eine Frage zu meinem TableModel.
Ich brauche ein Table das eine ArrayList mit String[] als Zeilen einliest, dafür habe ich nun versucht ein eigenes TableModel zu erstellen, allerdings füllt sich die Tabelle zwar mit leeren Zeilen wenn ich Daten adde, aber es sind halt nur leere Zeilen ohne Inhalt.
Unbenannt.JPG

Habt ihr vielleicht eine Idee wo der Fehler liegt (bin Anfänger, kann also auch ein ziemlich grober Schnitzer sein :rtfm:)
Hier ein Ausschnitt des TableModel Code:

Java:
public class STableModel extends AbstractTableModel {

    private ArrayList rowList;
    private String[] headers = {"Benutzer","Account"};
    
    public STableModel(ArrayList data) {
        rowList = data;
    }

[...]

}


Und hier das Erstellen der JTable:

Java:
public final class Hauptfenster {

ArrayList dataList = new ArrayList();

    public Hauptfenster() {
        
        dataList.add(new String[] {"1", "2"});
        dataList.add(new String[] {"1", "2"});

        STableModel test = new STableModel(dataList);
        final JTable table = new JTable(test);

        final JScrollPane scrollingTable = new JScrollPane(table,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

      frame.add(scrollingTable);
}

[...]

}


Mfg
Fabian
 

turtle

Top Contributor
Also grundsäzlich solltest auf das Interface List wechseln und dann EINE Implementierung wählen. So ist es besserer Stil.
Also
Java:
List<String> listStrings = new ArrayList<>();
Hier mal mein AbstractTableModel für Daten die aus zwei Strings bestehen.

Java:
class MeinTableModel extends AbstractTableModel {
	private List<Daten> listDaten;
	private List<String> listColumns;

	public MeinTableModel(List<Daten> daten) {
		this.listDaten = new ArrayList<Daten>();
		for (Daten datenSatz : daten) {
			listDaten.add(datenSatz);
		}
		listColumns = new ArrayList<String>();
		listColumns.add("Benutzer");
		listColumns.add("Account");

	}

	public List<Daten> getListDaten() {
		return listDaten;
	}

	public void addiereNeueDaten(List<Daten> neueDaten) {
		for (Daten daten : neueDaten) {
			listDaten.add(daten);
		}
		fireTableStructureChanged();
	}

	@Override
	public int getRowCount() {
		return listDaten.size();
	}

	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return String.class;
		}
		return null;
	}

	@Override
	public int getColumnCount() {
		return listColumns.size();
	}

	public String getColumnName(int column) {
		return listColumns.get(column);
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Daten daten = listDaten.get(rowIndex);
		if (daten != null) {
			switch (columnIndex) {
			case 0:
				return daten.getBenutzer();
			case 1:
				return daten.getAccount();
			}
		}
		return null;
	}

class Daten {
	private String benutzer;
	private String account;

	public Daten(String benutzer, String account) {
		this.benutzer = benutzer;
		this.account = account;
	}

	public String getBenutzer() {
		return benutzer;
	}

	public void setBenutzer(String benutzer) {
		this.benutzer = benutzer;
	}

	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

}
}
 
Zuletzt bearbeitet:

expensne

Mitglied
Danke sehr, klappt! :)

Edit:

Eine Frage noch, wie bekomm ich es nun hin das es sich auch aktualisiert? (ohne die oben erstellte addiereNeueDaten Methode zu nutzen)
Habe folgendes:

Java:
public void addUserData(String acc, String user, String pass) {

        dataList.add(new Daten(acc, user, pass));
        test.fireTableStructureChanged();
}

Allerdings aktualisiert sich nichts.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Da du die gepostete Methode völlig aus dem Zusammenhang gerissen hast, kann man nur vermuten, was passiert:
Die addUserData Methode gehört zu deinem Hauptfenster, und die Daten werden zu deren dataList Objekt hinzugefügt.
Das Objekt, was dein TableModel verwendet, ist jedoch eine andere ArrayList. Sie wurde zwar mal als Kopie aus dem dataList Objekt erstellt, hat danach aber nix mehr damit zu tun.
Mache es so wie turtle und füge die Daten direkt dem TableModel hinzu.
Zu deinem obigen Post noch folgender Hinweis: Wenn in deiner JTable nicht die Daten erscheinen, die du erwartet, solltest du auf jeden Fall die getValueAt(int row, int column) Methode deines TableModels posten. Hast du ernsthaft erwartet, daß jemand anhand deines Codeschnipsels sagen kann, warum keine Daten erscheinen?
 

turtle

Top Contributor
Ich zeige dir mal mein Demo-Programm zum Thema JTable:)

Hier werden über den Button Add/Reload jedesmal 10 neue Einträge hinzugefügt und die JTable aktualisiert.
Java:
package jtable;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

@SuppressWarnings("serial")
public class Table extends JPanel {
	private MeinTableModel tableModel;
	private List<Daten> listDaten;
	private JTable table;
	private JButton btnAdd;
	private Random random = new Random();
	private TableRowSorter<TableModel> sorter;
	private JScrollPane scrollPane;

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Table() {
		setLayout(new BorderLayout());
		// @formatter:off
        Daten[] memoryDaten = new Daten[] { 
            new Daten("Turtle", 20, false,"1.1.1993"),
            new Daten("Andreas", 10, false,"10.5.2003"),
            new Daten("Bärbel", 30, true,"20.02.1986"),
            new Daten("Christian", 40, false,"11.11.1980"),
            new Daten("Doris", 50, false,"22.02.1970"),
            new Daten("Emil", 66, true,"7.2.1966"),
            new Daten("Franziska", 70, true,"12.9.1955"),
            new Daten("Gerhard", 30, false,"16.08.1983"),
            new Daten("Heike", 33, false,"17.08.1986"),
            new Daten("Ingo", 22, false,"30.12.1992"),
        };
        listDaten = new ArrayList<>();
        for (Daten daten : memoryDaten) {
			listDaten.add(daten);
		}
        // @formatter:on
		listDaten = Arrays.asList(memoryDaten);
		tableModel = new MeinTableModel(listDaten);
		table = new JTable(tableModel);
		sorter = new TableRowSorter<>(tableModel);
		RowFilter ageFilter = new RowFilter<MeinTableModel, Integer>() {

			@Override
			public boolean include(javax.swing.RowFilter.Entry<? extends MeinTableModel, ? extends Integer> entry) {
				MeinTableModel model = entry.getModel();
				int row = entry.getIdentifier();
				int alter = (int) model.getValueAt(row, 1);
				if (alter < 30) { return true; }
				return false;
			}

		};
		RowFilter nameFilter = new RowFilter<MeinTableModel, Integer>() {
			@Override
			public boolean include(javax.swing.RowFilter.Entry<? extends MeinTableModel, ? extends Integer> entry) {
				MeinTableModel model = entry.getModel();
				int row = entry.getIdentifier();
				String name = (String) model.getValueAt(row, 0);
				if (name.contains("n")) { return true; }
				return false;
			}

		};
		java.util.List<RowFilter<Object, Object>> allFilter = new ArrayList<RowFilter<Object, Object>>();
		allFilter.add(ageFilter); // Turtle, Andreas, Ingo
		allFilter.add(nameFilter); // Andreas, Christian, Franziska, Ingo
		RowFilter<Object, Object> bothFilterAnded = RowFilter.andFilter(allFilter);
		sorter.setRowFilter(bothFilterAnded); // Andreas, Ingo
		// table.setRowSorter(sorter);
		// table.setAutoCreateRowSorter(true);
		btnAdd = new JButton("Add/Reload");
		btnAdd.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));

				int suffix = random.nextInt(10);
				// @formatter:off
				Daten[] neueDaten = new Daten[] { 
            new Daten("Turtle-"+suffix, 20, false, "1.1.1993"), 
            new Daten("Andreas-"+suffix, 10, false, "10.5.2003"),
            new Daten("Bärbel-"+suffix, 30, true, "20.02.1988"), 
            new Daten("Christian-"+suffix, 40, false, "11.11.1980"),
            new Daten("Doris-"+suffix, 50, false, "22.02.1970"), 
            new Daten("Emil-"+suffix, 66, true, "7.2.1966"),
            new Daten("Franziska-"+suffix, 70, true, "12.9.1955"), 
            new Daten("Gerhard-"+suffix, 30, false, "16.08.1983"),
            new Daten("Heike-"+suffix, 33, false, "17.08.1986"), 
            new Daten("Ingo-"+suffix, 22, false, "30.12.1992"), };
        // @formatter:on
				List<Daten> neuDaten = Arrays.asList(neueDaten);
				tableModel.addiereNeueDaten(neuDaten);

			}
		});
		scrollPane = new JScrollPane(table);
		add(scrollPane, BorderLayout.CENTER);
		add(btnAdd, BorderLayout.SOUTH);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Table Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new Table());
		frame.pack();
		frame.setVisible(true);
	}
}

@SuppressWarnings("serial")
class MeinTableModel extends AbstractTableModel {
	private List<Daten> listDaten;
	private List<String> listColumns;

	public MeinTableModel(List<Daten> daten) {
		this.listDaten = new ArrayList<Daten>();
		for (Daten datenSatz : daten) {
			listDaten.add(datenSatz);
		}
		listColumns = new ArrayList<String>();
		listColumns.add("Name");
		listColumns.add("Alter");
		listColumns.add("Rentner");
		listColumns.add("Geburtstag");

	}

	public List<Daten> getListDaten() {
		return listDaten;
	}

	public void addiereNeueDaten(List<Daten> neueDaten) {
		for (Daten daten : neueDaten) {
			listDaten.add(daten);
		}
		fireTableStructureChanged();
	}

	@Override
	public int getRowCount() {
		return listDaten.size();
	}

	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return Integer.class;
		case 2:
			return Boolean.class;
		case 3:
			return Date.class;
		}
		return null;
	}

	@Override
	public int getColumnCount() {
		return listColumns.size();
	}

	public String getColumnName(int column) {
		return listColumns.get(column);
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Daten daten = listDaten.get(rowIndex);
		if (daten != null) {
			switch (columnIndex) {
			case 0:
				return daten.getName();
			case 1:
				return daten.getAlter();
			case 2:
				return daten.isRentner();
			case 3:
				return daten.getGeburtstag();
			}
		}
		return null;
	}
}

class Daten {
	private String name;
	private Boolean rentner;
	private Date geburtstag;
	private Integer alter;
	private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

	public Daten(String name, Integer alter, Boolean rentner, String geb) {
		try {
			this.name = name;
			this.alter = alter;
			this.rentner = rentner;
			this.geburtstag = sdf.parse(geb);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Boolean isRentner() {
		return rentner;
	}

	public void setRentner(Boolean rentner) {
		this.rentner = rentner;
	}

	public Date getGeburtstag() {
		return geburtstag;
	}

	public void setGeburtstag(Date geburtstag) {
		this.geburtstag = geburtstag;
	}

	public int getAlter() {
		return alter;
	}

	public void setAlter(Integer alter) {
		this.alter = alter;
	}
}
Das mit den ageFilter bzw. nameFilter ist einkommentiert, weil es "nur" zeigen soll, wie die Anzeige gefiltert werden kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
H LayoutManager RPG Programmieren, eigenes Spielfeld grafisch generieren aus Tileset AWT, Swing, JavaFX & SWT 18
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
N LookAndFeel Wie kann ich mein eigenes LookAndFeel machen? AWT, Swing, JavaFX & SWT 6
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
J Eigenes Gui/ Look and Feel AWT, Swing, JavaFX & SWT 14
D Eigenes Textfeld AWT, Swing, JavaFX & SWT 8
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
C Eigenes Hintergrundbild einfügen AWT, Swing, JavaFX & SWT 6
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
P Eigenes Textverarbeitungsprogramm AWT, Swing, JavaFX & SWT 4
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
Developer_X LookAndFeel Eigenes Look And Feel erstellen AWT, Swing, JavaFX & SWT 33
B SWT Eigenes Icon für CheckboxTreeViewer AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Design-Frage: eigenes Line-Wrapping AWT, Swing, JavaFX & SWT 5
M Swing eigenes StyledDocument AWT, Swing, JavaFX & SWT 2
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
M Eigenes ActionEvent / Eigener Listener AWT, Swing, JavaFX & SWT 2
G JToolbar gleich als eigenes Fenster öffnen AWT, Swing, JavaFX & SWT 2
G Eigenes ComboBoxModel AWT, Swing, JavaFX & SWT 2
M eigenes DialogFenster AWT, Swing, JavaFX & SWT 4
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
J eigenes JOptionPane ? AWT, Swing, JavaFX & SWT 2
D Eigenes Tooltip AWT, Swing, JavaFX & SWT 5
G eigenes option pane AWT, Swing, JavaFX & SWT 5
C Eigenes Event AWT, Swing, JavaFX & SWT 8
S Eigenes Package für die GUI? AWT, Swing, JavaFX & SWT 6
P Eigenes Look&Feel schreiben (Tutorials?) AWT, Swing, JavaFX & SWT 6
B Eigenes Events AWT, Swing, JavaFX & SWT 3
G für showInputDialog kein eigenes Icon auswählen AWT, Swing, JavaFX & SWT 6
M JDialog und eigenes Icon AWT, Swing, JavaFX & SWT 10
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
C TableModel zugehörige Table ermitteln AWT, Swing, JavaFX & SWT 3
W Neues TableModel und JTable wird nicht refreshed AWT, Swing, JavaFX & SWT 3
D Swing JTable TableModel + RowCount AWT, Swing, JavaFX & SWT 18
JAVAnnik Problem mit TableModel AWT, Swing, JavaFX & SWT 3
S Swing Setzen von TableModel liefert NullPointer AWT, Swing, JavaFX & SWT 6
S TableModel Header wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
K verständnissproblem mit TableModel AWT, Swing, JavaFX & SWT 2
K zwei TableModel AWT, Swing, JavaFX & SWT 9
N Swing Eintrag in JTable an dessen TableModel weiterreichen AWT, Swing, JavaFX & SWT 3
hdi Swing Komisches Problem mit TableModel & setAutoCreateRowSorter AWT, Swing, JavaFX & SWT 2
E Swing TableModel fireTableDataChanged führt zu IndexOutOfBoundsException AWT, Swing, JavaFX & SWT 9
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
K JTable +TableModel --> Anpassung der Tabellengröße (Zeilenanzahl) AWT, Swing, JavaFX & SWT 3
K TableModel mit Daten aus Datenbank füllen AWT, Swing, JavaFX & SWT 7
K TableModel Daten übergeben AWT, Swing, JavaFX & SWT 9
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
X Swing Daten aus Vector ins TableModel ?? AWT, Swing, JavaFX & SWT 12
E JTable und tablemodel Verständnisproblem AWT, Swing, JavaFX & SWT 3
C Kann Konstruktor von eigenem TableModel nicht nutzen AWT, Swing, JavaFX & SWT 2
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
R JTable - TableModel AWT, Swing, JavaFX & SWT 6
D JTable - TableColumnModel - TableModel AWT, Swing, JavaFX & SWT 3
S JTable nimmt TableModel nicht an AWT, Swing, JavaFX & SWT 4
D Mehrere CheckBoxen im TableModel wechselseitig ausschließen AWT, Swing, JavaFX & SWT 5
R TableModel und Columnmodel - Zusammenspiel? AWT, Swing, JavaFX & SWT 2
G TableModel mit anderen Spalten AWT, Swing, JavaFX & SWT 4
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8
D TableModel + Daten bearbeiten + Daten zurückschreiben AWT, Swing, JavaFX & SWT 9
G Frage zu JTable und TableModel AWT, Swing, JavaFX & SWT 4
O TableModel AWT, Swing, JavaFX & SWT 12
V Vector->TableModel->RowSorter:Bei Markierung Index im AWT, Swing, JavaFX & SWT 2
S Daten aus editierbaren TableModel lesen AWT, Swing, JavaFX & SWT 7
F TableModel Spaltenkoepfe benamen, wie? AWT, Swing, JavaFX & SWT 2
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
N TableModel mit CheckBox? AWT, Swing, JavaFX & SWT 5
J Tablemodel AWT, Swing, JavaFX & SWT 2
G jTable + ScrollPane (+ TableModel) AWT, Swing, JavaFX & SWT 7
D invokeLate bei änderung im TableModel? AWT, Swing, JavaFX & SWT 4
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
G TableModel auswerten und in Datei schreiben AWT, Swing, JavaFX & SWT 3
P JTable TableModel JFreeReport AWT, Swing, JavaFX & SWT 4
T anlegen einer jTable mit TableModel AWT, Swing, JavaFX & SWT 3
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben