Classe an JTable binden

Status
Nicht offen für weitere Antworten.

Ellegon

Mitglied
Hallo zusammen,

ich bin gerade total verwirrt beim Thema JTable, trotz des sehr guten Tutorials. Vielleicht kann mich jemand in die richtige Richtung schupfen...

Situation:

Ich habe eine Datenbank und lade daraus via Hibernate Daten. Diese bekomme ich in eine Liste, die ich durchgehen kann.

Nun will ich das Resultat in einer Tabelle darstellen. Was bereits funktioniert ist eine Schlaufe, die die Liste durchgeht und die Felder entsprechend abfüllt. Unschön dabei ist aber, dass ich die Werte der Klasse manuell einer Kolonne zuteile. Wenn nun ein User einen Wert ändern würde, dann müsste ich diese Aenderung ja auch wieder manuell in die Klassen-Instanz eintragen um diese Instanz dann wieder via Hibernate speichern zu können.

Viel schöner wäre es deshalb, wenn ich die Klasse an die Tabelle "binden" könnte und er dann weiss, welche Kolonne welchem Feld zugeordnet ist.

Im Tutorial ist dazu ein Beispiel mit Vehikeln. Mein Problem dabei ist, dass im Beispiel alle Komponenten (TableModel, Class und JTable) in einem ist. Ich habe aber bereits eine existierende Klasse (in meinem Beispiel die Klasse "Person") und möchte diese in einem Dialog (z.B. "dlgShowAll") darstellen. Wo mache ich nun diesen Vektor? In der Klasse "Person" oder in der Klasse "dlgShowAll"). Beim Dialog müsste ich dass dann ja bei jedem neuen Dialog machen, auch wenn ich an einer anderen Stelle vielleicht das genau gleiche mache. Oder kann ich den Vektor in der Klasse "Person" machen, und habe ihn dann jedesmal quasi zur Verfügung? Da das TableModel ja ein Interface ist, muss ich es eigentlich in eine eigene Klasse machen. Aber ist das eine zusätzliche (z.B. PersonTable)?

Vielleicht kann mir jemand helfen, meine Verwirrung zu lösen.

Ellegon
 

norman

Top Contributor
du kannst das objekt, dass du in der tabelle abbildest, immer in die erste spalte stecken (und die spalte dann ausblenden) und dann damit arbeiten.

wie bildest du denn derzeit ein objekt in der tabelle ab?
ungefähr so?:
Code:
for (...) {
Vector row = new Vector(3);

row.add(person.getName());
row.add(person.getAnschrift());
row.add(person.getGeb());

myRows.add(row);
}
myTableModel.setData(myRows, myHeader)
 

André Uhres

Top Contributor
Hier ist ein etwas anderer Ansatz, ich bin aber nicht sicher ob du sowas suchst.
Die Klasse "Person" kapselt die Daten in Form eines Arrays aus dem man mit "getData"
die benötigten Spalten in der benötigten Reihenfolge rausholen kann:
Code:
model.addRow( person.getData(Person.NAME, Person.NUMMER) );
"setData" macht dann das gleiche umgekehrt:
Code:
person.setData(rowData);
Code:
/*
 * PersonDemo.java
 */
package person;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class PersonDemo extends JFrame {
    private JButton btPersonen;
    private JToolBar toolbar;
    private PersonenDisplay personenDisplay;
    public PersonDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null); 
        toolbar = new JToolBar();
        btPersonen = new JButton("Personen");
        toolbar.add(btPersonen);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        btPersonen.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btPersonenActionPerformed(evt);
            }
        });
        personenDisplay = new PersonenDisplay(this, true);
    }
    private void btPersonenActionPerformed(final ActionEvent evt) {
        personenDisplay.setVisible(true);
    }
    public static void main(final String args[]) {new PersonDemo().setVisible(true);}
}
Code:
/*
 * PersonenDisplay.java
 */
package person;
import java.awt.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;
public class PersonenDisplay extends JDialog {
    private JTable table;
    private DefaultTableModel model;
    public PersonenDisplay(final Frame parent, final boolean modal) {
        super(parent, modal);
        setSize(300,200);
        setLocationRelativeTo(parent);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        initComponents();
        fillTable();
    }
    private void initComponents() {
        model = new DefaultTableModel(new String [] {"Name", "Nummer"}, 0) {
            Class[] types = new Class [] {
                String.class, Integer.class
            };
            boolean[] canEdit = new boolean [] {
                true, false
            };
            public Class getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
            public boolean isCellEditable(final int rowIndex, final int columnIndex) {
                return canEdit [columnIndex];
            }
        };
        table = new JTable(model);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
    }
    private void fillTable() {
        List<Person> personen = getPersonen();
        model.setRowCount(0);
        for (Person person : personen){
            model.addRow( person.getData(Person.NAME, Person.NUMMER) );
            System.out.println(person);
        }
    }
    private List<Person> getPersonen() {
        List<Person> personen = new ArrayList<Person>();
        personen.add(new Person(101, "Max", "Meier"));
        personen.add(new Person(103, "Paul", "Schmit"));
        return personen;
    }
}
Code:
package person;
/*
 * Person.java
 */
import java.util.*;
class Person {
    public static final int NUMMER = 0;
    public static final int VORNAME = 1;
    public static final int NAME = 2;
    private Object[] data;
    private List<Integer> spalten;
    public Person(final int nummer, final String vorname, final String name){
        data = new Object[3];
        data[NUMMER] = nummer;
        data[VORNAME] = vorname;
        data[NAME] = name;
    }
    public Object[] getData(final int... id){
        Object[] rowData = new Object[id.length];
        spalten = new ArrayList<Integer>();
        for (int i = 0; i < id.length; i++){
            spalten.add(id[i]);
            rowData[i] = data[id[i]];
        }
        return rowData;
    }
    public void setData(final Object[] newData){
        int i = 0;
        for (Integer spalte : spalten) {
            data[spalte] = newData[i++];
        }
        //TODO: "data" in Datenbank abspeichern
    }
    public String toString(){return Arrays.toString(data);}
}
 

norman

Top Contributor
bei deiner setData-methode ist aber nicht klar, welche felder in dem newData-array sind. nummer+vorname? oder nummer+name? oder vorname+name?

so müsste man entweder immer ALLE felder setzen, oder eine Map nehmen. oder jedes feld einzeln setzen.
 

André Uhres

Top Contributor
norman hat gesagt.:
bei deiner setData-methode ist aber nicht klar, welche felder in dem newData-array sind. nummer+vorname? oder nummer+name? oder vorname+name?..
"setData" soll eigentlich nur genau das Umgekehrte machen wie "getData":
die Reihenfolge der Spalten wird also bei "getData" in der Liste "spalten" festgehalten.
Man nimmt anschliessen einfach immer die gleiche Reihenfolge.
 

André Uhres

Top Contributor
norman hat gesagt.:
okay. aber idR wird man zuerst setzen, und später irgendwann den getter nutzen.
Ja gut, das ist aber nicht der ursprüngliche Zweck dieser Methoden im Beispiel.
Im Beispiel werden die Daten im Konstruktor gesetzt.
"getData" und "setData" betreffen nur eine Auswahl dieser Daten, in der benötigten Reihenfolge.
 

norman

Top Contributor
jedenfalls wäre es schon recht cool, wenn es eine tablemodel gäbe, welches als dataVector ein vector mit pojos hält und per reflection dann die felder des pojos in die tabelle mappt.

schonmal gemacht/ gibts sowas? hatte da vor einiger zeit mal nichts gefunden aber auch keine zeit das selbst zu implementieren. zumal es nicht so trivial sein dürfte.
 

André Uhres

Top Contributor
Im Augenblick seh ich darin keinen besonderen Vorteil, ausser vielleicht wenn man gleichzeitig verschiedene TableModels für die gleichen Daten benötigen würde. Sowas hab ich aber noch nie gebraucht, geschweige denn gemacht.
 

norman

Top Contributor
der vorteil wäre schon enorm.

ich habe in einer anwendung ungefähr 10 pojos, die alle in einer DB gespeichert werden. 3 davon werden z Zt in tabellenform dargestellt.

mein tablemodel bekommt dafür einen parameter (enum), welches pojo es genau darstellen soll. jetzt prüft das model seine instanzvariable "typ" und setzt entsprechend die spaltenanzahl und deren header. auch beim zufügen von daten wird jedesmal "typ" geprüft (switch-case).
das ist lästig und ich muss für jedes neue pojo, welches die tabelle darstellen können soll, das model erweitern (bzw die switch-cases).

Code:
switch (this.typ) {
 case person:
    break;
 case objekt1:
    break;
 case objekt2:
    break;
}


viel komfortable und produktiver (jedenfalls wenn mehr als 3 pojos abgebilden werden) wäre ein (generisches) tablemodel, dass die pojos (egal welchen typs - hauptsache alle im model sind gleich) automatisch mappt.
 

André Uhres

Top Contributor
norman hat gesagt.:
..egal welchen typs - hauptsache alle im model sind gleich..
In dem Fall würde ich wahrscheinlich für jeden Typ einfach ein neues Model machen.
Ein Einheitsmodel für alle möglichen Daten hab ich jedenfalls noch nicht gebraucht.
 

norman

Top Contributor
einfach? so toll ist das nicht, wenn du am ende 10 models hast. uU hast du dann auch noch 10 tabellen und X cell-renderer und alles ist irgendwie redundant, zumal (jedenfalls in meinem falle) die pojos alle von einer basisklasse erben und somit das model auch grundfunktionen für alle pojos mitbringen muss.

naja..wenn ich mal zeit habe..

so long.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B UML: Main classe verschwindet nach code generierung nicht?! Allgemeine Java-Themen 4
G eigener logger mittels classe (dynamische logfilename) log4j Allgemeine Java-Themen 15
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
D JTable mit JTextAreas in den Zellen Allgemeine Java-Themen 8
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
G jTable aktualisieren?! Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
V JTable Externe Lib Allgemeine Java-Themen 2
F JTable Pfeiltasten-Verhalten Allgemeine Java-Themen 1
T jTable Gestaffelte Überschriften Allgemeine Java-Themen 22
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
A JTable Bilder Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
A JTable - CellRange auslesen Allgemeine Java-Themen 2
A jTable Renderer Allgemeine Java-Themen 5
N JTable filtern Allgemeine Java-Themen 3
hdi JTable#print & Druckgröße Allgemeine Java-Themen 6
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
G JTable: ListSelectionListener removen Allgemeine Java-Themen 8
M JTable + ArrayList Allgemeine Java-Themen 3
G Aktualisierung einer JTable erfolgt nicht zuverlässig Allgemeine Java-Themen 14
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
P jTable getSelectedRow? Allgemeine Java-Themen 2
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
X xml aus Zip in JTable Allgemeine Java-Themen 2
L jTable drag & drop einzelner Zeilen Allgemeine Java-Themen 4
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
H JTable per iText in PDF: Größenanpassung möglich? Allgemeine Java-Themen 2
F XML zu JTable mit JDOM Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
Screen ImageIcon in Cell der JTable Allgemeine Java-Themen 2
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
A Swing JTable Polymorphismus Allgemeine Java-Themen 2
trash super + JTable Allgemeine Java-Themen 7
D JTable -> 1Spalte nur zahlen Allgemeine Java-Themen 2
L JTABLE setvalueat methode! Allgemeine Java-Themen 16
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
B JTable nach Icon sortieren Allgemeine Java-Themen 6
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
D JTable mit GROUP BY Allgemeine Java-Themen 23
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
P JTable drucken Allgemeine Java-Themen 8
A JTable Feldwerte in JTextFelder mit blättern Allgemeine Java-Themen 5
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
M jTable Allgemeine Java-Themen 19
D jTable und TableModel Allgemeine Java-Themen 2
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P Textfile -> Array -> JTable Allgemeine Java-Themen 9
S JTable Aktuelisieren ber Wie ? Allgemeine Java-Themen 4
MQue JComboBox in JTable Allgemeine Java-Themen 4
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
MQue JTable alles rechts Allgemeine Java-Themen 8
G Checkboxen abfragen,Auswahl sichern, JTable laden Allgemeine Java-Themen 2
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
R JTable und Cell Renderer Allgemeine Java-Themen 3
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
J keylistener auf jtable Allgemeine Java-Themen 19
C JTable, Abstand zwischen Zellen Allgemeine Java-Themen 2
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
D JTable -> ArrayIndexOutOfBoundsException bei Mausklick Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
G Daten in / für JTable beim Scrollen nachladen? Allgemeine Java-Themen 5
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
P JTable Allgemeine Java-Themen 2
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
P JTable setDataVector Allgemeine Java-Themen 2
D Scrollbalken in meiner JTable auf einmal weg. Allgemeine Java-Themen 2
P JTable Allgemeine Java-Themen 8
P JButtons mit JTable verknüpfen Allgemeine Java-Themen 16
G fehler bei JTable mit JDK1.6 Allgemeine Java-Themen 4
M CheckBox in JTable - ich verzweifle gleich Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
P JTable Allgemeine Java-Themen 4
E JButton bleibt in der JTable Allgemeine Java-Themen 2
E JButton in einer Zelle von JTable Allgemeine Java-Themen 16
P JTable selektierte Zeile mitwandern Allgemeine Java-Themen 2
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
P JTable suchen in einer Spalte Allgemeine Java-Themen 24
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
C Ausdrucken einer JTable in eine Datei mit Erhalt des Formats Allgemeine Java-Themen 3
W Columns austauschen/verschieben von jtable Allgemeine Java-Themen 3
P 3rd party JTable libraries (freeware/opensource) Allgemeine Java-Themen 19
D JTable aus Eclipse Ok, kompeliert aber nicht Allgemeine Java-Themen 6
G mySQL und JTable Allgemeine Java-Themen 7
D JTable und Buttons Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben