JTable und AbstractTableModel

infboy

Mitglied
Hallo,
ich habe eine Klasse "NameWindow" die eine Tabelle beinhaltet.
Ich habe auch eine Klasse "NameWindowTableModel" die eine AbstractTableModel für die Tabelle in "NameWindow" darstellen soll. (ich hoffe ich habe sie richtig implementiert da ich swing-Anfänger bin)
Jetzt möchte ich die Tabelle in "NameWindow" mit der selbst implementierte AbstractTableModel verbinden. Ich weiss nur nicht wie?
Habe im net gelesen, dass man in "NameWindow" eine Variable von dem Typ "NameWindowTableModel" implementieren soll. Dadurch sollte man das Problem einfach lösen können.(habe das gemacht und auskommentiert. line 17)
Weiss aber jetzt nicht genau wie und wo man mit dieser Variable umgehen soll und ob es überhaupt richtig ist, oder man es grundsätzlich anders machen muss?

Wäre für jede Hilfe Dankbar!

Anbei die zwei Klassen:

NameWindow:
Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;


public class NameWindow extends JFrame {
	
	
	/*
	 * die auskommetierte Variable
	 */
//	private static NameWindowTableModel nameTableModel;

	private JPanel contentPane;
	private JTable table;
	private JScrollPane scrollPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					NameWindow frame = new NameWindow();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public NameWindow() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 11, 251, 100);
		contentPane.add(scrollPane);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
			},
			new String[] {
				"New column", "New column", "New column"
			}
		));
		scrollPane.setViewportView(table);
	}
}

NameWindowTableModel:
Java:
import javax.swing.table.AbstractTableModel;


public class NameWindowTableModel extends AbstractTableModel {

//	@Override
//	public int getColumnCount() {
//		// TODO Auto-generated method stub
//		return 0;
//	}
//
//	@Override
//	public int getRowCount() {
//		// TODO Auto-generated method stub
//		return 0;
//	}
//
//	@Override
//	public Object getValueAt(int rowIndex, int columnIndex) {
//		// TODO Auto-generated method stub
//		return null;
//	}
	
	
	public int getColumnCount(){
		return 3;
	}
	
	
	public int getRowCount(){
		return 25;
	}
	
	public Class<?> getColumnClass(int columnIndex){
		switch(columnIndex){
		case 0: return boolean.class;
		case 1: return String.class;
		case 2: return String.class;
		default: throw new IllegalArgumentException("Falsche Spalte");
		}
	}
	
	public String getColumnName(int columnIndex){
		switch(columnIndex){
		case 0: return "Verheiratet?";
		case 1: return "Name";
		case 2: return "Nachname";
		default: throw new IllegalArgumentException("Falsche Spalte");
		}
	}
	
	public boolean isCellEditable(int rowIndex, int columnIndex){
		switch(columnIndex){
		case 0: return true;
		case 1: return true;
		case 2: return true;
		default: throw new IllegalArgumentException("Falsche Spalte");
		}
	}
	
	public Object getValueAt(int rowIndex, int columnIndex) {
        switch(columnIndex){
        case 0: return null;
        case 1: return null;
        case 2: return null;
        default: throw new IllegalArgumentException("Falsche Zeile oder Spalte");
        }
	}

}
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
Du hast in Zeile 17 nur die Deklarierung des TableModels auskommentiert. Der Tabelle weist du ein neues DefaultTableModel zu, was mit deinem anderen TableModel garnichts zu tun hat. Das heisst, wenn du ein eigenes TableModel anlegst und erstellst, dann musst du das natürlich auch der Tabelle mit setModel(tableModel) übergeben.
 

infboy

Mitglied
also in NameWindow statt

Java:
table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
			},
			new String[] {
				"New column", "New column", "New column"
			}
		));

einfach linie 17 einkommentieren und folgendes schreiben

Java:
table.setModel(nameTableModel);

Das funktioniert aber immernoch nicht :(
 
C

Camino

Gast
einfach linie 17 einkommentieren und folgendes schreiben

Java:
table.setModel(nameTableModel);

Das funktioniert aber immernoch nicht :(

Nur das einkommentieren und deklarieren reicht so nicht. Du musst auch von dem TableModel ein Objekt erstellen. Also entweder
Java:
table.setModel(new NameTableModel());
oder
Java:
NameTableModel nameTableModel = new NameTableModel()
table.setModel(nameTableModel);
schreiben. Dann müsstest du aber in dem TableModel auch noch Daten zur Verfügung stellen, welche in den Zellen angezeigt werden sollen.
 

ARadauer

Top Contributor
Dein Table Model braucht mal Daten... wo bekommt es den die her?

Der schöne Vorteil von einem eigenen Table Model ist, dass man mit eigenen Objekten arbeiten kann und nicht mit irgendwelchen Object[][] herum wurschteln muss. Ist zwar oft etwas aufändiger, aber die meiste Zeit sind wir dabei irgend etwas nachzuvollziehen bzw fehler zu suchen,.. also die paar Minuten für ein Objekte und ein eigenes Table Model rechnen sich schnell..

Also was wollen wir anzeigen? Personen?

zb so..

Java:
public class Person {
	private String name;

	private String vorname;
	private boolean verheiratet;

	public Person(String vorname, String name, boolean verheiratet) {
		super();
		this.vorname = vorname;
		this.name = name;
		this.verheiratet = verheiratet;
	}

	public String getName() {
		return name;
	}

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

	public String getVorname() {
		return vorname;
	}

	public void setVorname(String vorname) {
		this.vorname = vorname;
	}

	public boolean isVerheiratet() {
		return verheiratet;
	}

	public void setVerheiratet(boolean verheiratet) {
		this.verheiratet = verheiratet;
	}

}
klar oder?

gut dann halten wir mal eine liste in unserem model und greifen auf die daten zu...

Java:
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class NameWindowTableModel extends AbstractTableModel {

	List<Person> personen = new ArrayList<Person>();

	public int getColumnCount() {
		return 3;
	}

	public int getRowCount() {
		return personen.size();
	}

	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return boolean.class;
		case 1:
			return String.class;
		case 2:
			return String.class;
		default:
			throw new IllegalArgumentException("Falsche Spalte");
		}
	}

	public String getColumnName(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return "Verheiratet?";
		case 1:
			return "Name";
		case 2:
			return "Nachname";
		default:
			throw new IllegalArgumentException("Falsche Spalte");
		}
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		switch (columnIndex) {
		case 0:
			return true;
		case 1:
			return true;
		case 2:
			return true;
		default:
			throw new IllegalArgumentException("Falsche Spalte");
		}
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		Person person = personen.get(rowIndex);
		switch (columnIndex) {
		case 0:
			return person.isVerheiratet();
		case 1:
			return person.getVorname();
		case 2:
			return person.getName();
		default:
			throw new IllegalArgumentException("Falsche Zeile oder Spalte");
		}
	}

	public void setData(List<Person> personen) {
		this.personen = personen;
		fireTableDataChanged(); // wir sagen der JTable die Daten haben sich geändert!
	}

}
ok? also dieses fireTableDataChanged ist interessant, kannst in der api gerne nachlesen was AbstractTableModel usw noch so bietet... eigentlich ganz einfach...

gut jetzt noch in der view die daten setzen...

Java:
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
 
public class NameWindow extends JFrame {
    
    
    
  private NameWindowTableModel nameTableModel; //nicht static!
 
    private JPanel contentPane;
    private JTable table;
    private JScrollPane scrollPane;
 
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    NameWindow frame = new NameWindow();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
 
    /**
     * Create the frame.
     */
    public NameWindow() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 11, 251, 100);
        contentPane.add(scrollPane);
        
        table = new JTable();
        nameTableModel = new NameWindowTableModel();
        table.setModel(nameTableModel);
        scrollPane.setViewportView(table);
        
        loadData();
    }

	private void loadData() {
		//in der praxis greifen wir hier hoft auf einen externen service oder datenbank zu...
		List<Person> personen = new ArrayList<Person>();
		personen.add(new Person("Andreas", "Radauer", false));
		personen.add(new Person("Tesi", "Tester", true));
		personen.add(new Person("Asdf", "Jklö", false));
		nameTableModel.setData(personen);
	}
}

sollte funktionieren...
 

ARadauer

Top Contributor
mit public void setValueAt(Object aValue, int rowIndex, int columnIndex)
kann man dann noch änderungen in seine liste schreiben, eventuell noch ein Set mit den nummern der geänderten zeilen und dann kann man bei einem speichnern schön auslesen was sich geändert hat...
 

infboy

Mitglied
ich möchte, dass in der Spalte "Verheiratet?" eine Checkbox angezeigt wird! in diesem Fall steht aber dort nur True und False!
Wie kann man das? Das sollte ja eigentlich mit Hilfe des NameWindowTableModel gesetzt werden oder nicht? ???:L
 

infboy

Mitglied
danke an alle!

jetzt klappts!

doofer fehlr von mir.
statt Boolean.class hatte ich da boolean.class! und es ging nicht und es ging nicht!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
N JTable, AbstractTableModel aus Datenbank initialisieren AWT, Swing, JavaFX & SWT 8
I JTable,AbstractTableModel Problem AWT, Swing, JavaFX & SWT 3
H JTable - DefaultTableModel vs AbstractTableModel AWT, Swing, JavaFX & SWT 5
K Swing jTable und AbstractTableModel AWT, Swing, JavaFX & SWT 6
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
K JTable & AbstractTableModel AWT, Swing, JavaFX & SWT 9
G JTable (AbstractTableModel) wird nicht aktualisiert AWT, Swing, JavaFX & SWT 2
D JTable, DefaultTableCellRenderer & AbstractTableModel AWT, Swing, JavaFX & SWT 11
N JTable repaint mit AbstractTableModel AWT, Swing, JavaFX & SWT 2
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben