JTable organisieren / strukturieren

Status
Nicht offen für weitere Antworten.
S

Shaguar

Gast
Also ich will mal versuchen mein Progrann kurz zu umschreiben.
In dem Programm kann man über ein Interface selbständig Tabellen erstellen die dann in einer SQL Datenbank angelegt werden. Im Hauptfenster kann man dann zwischen den Tabellen wechseln und sich alle einzeln anschauen und Daten einfügen / editieren.
Die Tabellen können nicht nur normale Felder enthalten sondern auch Dropdown-Listen in bestimmten Spalten oder Buttons oder Bilder oder sonst irgendwas.
Die Frage ist nun wie und wo soll ich diese Informationen speichern?
Sprich wenn ich eine Tabelle darstellen will, dann hab ich den Namen der Tabelle und damit hol ich die Spalten-Namen und Tabellen-Daten aus der Datenbank und erstelle anhand dieser Daten das DefaultTableModel und die Tabelle.
Ein kleines Bsp zum Prolem:
Die Tabelle besteht aus 5 Spalten und es sind alles String (sprich varchars in der Db), aber eine der Spalten soll nachher in der Tabelle als ComboBox dargestellt werden, so das man nur bestimmte Werte in die Tabelle schreiben kann. Das darstellen der Combobox in der Tabelle ist kein Problem, die Frage ist nur wo soll ich speichern das in eine Spalte der Tabelle Dropdowns stehen sollen anstatt der normale String Text aus der Datenbank.
Zuerst hab ich mir gedacht, das beim anlegen der SQL Tabelle gleichzeitig eine XML Datei erstellt wird in dem alle extra Infos zur Tabelle beschrieben werden. Beim anzeigen der Tabelle wollt ich dann einfach gleichzeitg das XML Dokument öffnen und schauen wie die Spalte genau dargestellt werden soll. Das funktioniert aber nicht so ganz wie ich es mir vorgestellt habe und ist auch irgendwie zu umständlich.
Ich hab mir auch noch überlegt, das man anfangs beim erstellen der Tabelle gleich die Tabelle selbst erstellt und nicht nur das SQL Create Statement und dieses dann serialisiert. Beim späteren anzeigen der Tabelle öffne ich dann einfach das serialisierte Objekt.
Habt ihr irgendwelche Vorschläge / Ideen wie ich das Ganze umsetzen könnte?
Hoffe das Problem ist einigermaßen klar geworden ansonsten beantworte ich gerne alle Fragen zum Thema.

Ganz kurz nochmal zusammen gefasst:
Habe mehrere Tabellen die ich zu Laufzeit erstelle, die Variabel sind in Anzahl und Inhalt. Sie können auch alles darstellen wie Combobox oder Radiobuttons. Wie speichere ich das Ganze ab?

Mfg
 

HLX

Top Contributor
Zur Combobox: Du packst den entsprechenden Spaltenwert aus der DB-Spalte in einen eigenen Datentyp, z.B. ComboboxItem.
Dann erzeugst du eine JCombobox und fügst die einzelnen Items hinzu. Anschließend kannst du dem Datentyp den entsprechenden Editor zuweisen:

Code:
myTable.setDefaultEditor(ComboboxItem.class, new DefaultEditor(myCombobox));

Mit den Radiobuttons ähnlich verfahren.
 
S

Shaguar

Gast
Sry aber das verstehe ich nciht ganz.
Die Frage ist ja woher ich weiss welche Spalte in der Datenbank später eine Combobox, IconFeld, ein Radiobutton etc sein soll. In der Datenbank stehen ja größtenteils nur Varchars aber nicht wie sie im SWT nachher dargestellt werden sollen.
 

HLX

Top Contributor
Ach so.

Tja, hier ist eine Datei mit Meta-Informationen schon sinnvoll. Würde das wahrscheinlich auch mit XML machen.

Wo genau siehst du hier ein Problem?
 
S

Shaguar

Gast
Also die XML Datei die ich erstellt habe sieht folgendermaßen aus :
Code:
<root>
  <Column>
    <Name>ID</Name>
    <Type>Integer field</Type>
  </Column>
  <Column>
    <Name>Title</Name>
    <Type>String</Type>
  </Column>
  <Column>
    <Name>Language</Name>
    <Type>Flag-field</Type>
  </Column>
</root>
und erstellen tue ich die Tabelle so:

Code:
columnNames = new Vector<String>();
Vector<Vector> data = new Vector<Vector>();
try 
        {
            ResultSet rs = SQLState.rsQuery(Query, SQLState.stm(Con));
            ResultSetMetaData meta = rs.getMetaData();
            int columnCount = meta.getColumnCount(); 
 
            for ( int i = 1; i <= columnCount; i++ ) 
            { 
                columnNames.addElement( meta.getColumnLabel(i) );
            }
            
            while (rs.next())
            {
             
                Vector<Object> row = new Vector<Object>(ColumnCount);
               
                for (int i = 1; i <= ColumnCount; i++) 
                {
                    row.addElement( rs.getObject(i) );
                }
                data.addElement( row );
             
            }
            rs.close();
        } 
        catch (SQLException ex) 
        {
            ex.printStackTrace();
        }

DefaultTableModel model = new DefaultTableModel(data, columnNames);

So und nun an dieser Stelle hier :
row.addElement( rs.getObject(i) );
müsste ich nun rausfinden in welcher Spalte ich mich befinde (also wie die Spalte heisst) dann in der XML Datei nachschauen ob und wo diese Spalte existiert und dann den entsprechenden Typ rausfinden und dann halt je nachdem eine Combobox oder sonst was in die Zelle schreiben. Das müsste ich dann bei jedem durchgang der While und der for Scheife machen, das könnte ganz schön ausbremsen wenn die Tabelle mal so 500-1000 Einträge hat.

Der andere Versuch die Tabelle gleich zu Beginn zu serialisieren, also mit

Code:
fos = new FileOutputStream( filename ); 
ObjectOutputStream o = new ObjectOutputStream( fos ); 
o.writeObject( table );
funktioniert auch nicht so ganz weil ersten alle Funktionen die mit den Zellen verknüpft waren verloren gingen nach dem deserialisieren, zb wenn ich nem Button der in einer Zelle stand die Funktion gab er soll Text ausgeben dann die Table serialisert habe, dann hatte der Button nach der deserialierung keine Funktion mehr. Desweiteren soblab ich die Tabelle anklicke und / oder ein Feld in der Tabelle editieren will dann kommt ein
"java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover" Fehler.
 

HLX

Top Contributor
Shaguar hat gesagt.:
So und nun an dieser Stelle hier :
row.addElement( rs.getObject(i) );
müsste ich nun rausfinden in welcher Spalte ich mich befinde (also wie die Spalte heisst) dann in der XML Datei nachschauen ob und wo diese Spalte existiert und dann den entsprechenden Typ rausfinden und dann halt je nachdem eine Combobox oder sonst was in die Zelle schreiben. Das müsste ich dann bei jedem durchgang der While und der for Scheife machen, das könnte ganz schön ausbremsen wenn die Tabelle mal so 500-1000 Einträge hat.

Ich finde die XML-Lösung eigentlich ganz gut. Für die Performance würde ich allerdings nicht ständig in die XML-Datei schauen, sondern diese für die jeweilige Tabelle nur einmal laden und die Metadaten der Tabelle als Objekt vorhalten.

Du könntest beim durchgehen des Tabellenkopfs direkt anhand des Metadaten-Objekts ein Modell erzeugen, das angibt welche Spalte welchen Datentyp enthält. Dazu den Spaltennamen mit dem entsprechenden Namen der XML-Datei erzeugen und irgendwie Spaltennummer und Datentyp merken. Dann hast du nachher nur noch eine Switch- (oder mehrere If-)Anweisungen, wenn du das Resultset durchgehst.
 
S

Shaguar

Gast
gut dann versuch ich das mal so,
aber würde es denn auch theoretisch mit der Serialisierung gehen? Wie kann man das denn lösen das er nachdem editieren der Tabelle das Objekt noch serialisiert und das die Listener der Tabelle beim serialisieren nicht verloren gehen?
 
S

Shaguar

Gast
also hab das Ganze mal so versucht :
Code:
HashMap<String, HashMap> columnInfos = new HashMap<String, HashMap>();
Vector<String> columnNames = new Vector<String>();
[...]
Vector<Object> row = new Vector<Object>(ColumnCount);
String cn;
HashMap storage = null;

            for (int i = 1; i <= columnCount; i++) 
                {
                    cn = columnNames.get(i-1);
                    storage = columnInfos.get(String.valueOf(i-1));
                    if (storage.get("Type").equals("String"))
                    {
                        row.addElement( rs.getObject(i) );
                    }
                    else if (storage.get("Type").equals("Combobox-field"))
                    {
                        row.addElement( getCombox() );
                    }
                    
                }

columnInfos ist eine HashMap die er aus der XML Datei erzeugt hat und alle Infos dort abspeichert.
Jeder Value in der HashMap repräsentiert eine eigene HashMap die wiederrum eine Spalte der Tabelle beschreibt.
columnNames ist der Vector in dem die Spaltennamen stehen und der später dem DefaultTableModel als Konsturktor übergeben wird.
So funktioniert das eigentlich schon, aber gibts da vielleicht irgendwelche optimierungs Vorschläge?
 

HLX

Top Contributor
Ich würde die hart codierten Strings ("Type" etc.) in Konstanten packen. Du wirst sie ja wahrscheinlich an mehreren Stellen brauchen und falls du sie mal ändern willst hast du´s damit leichter.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
N Swing Print JTable mit AbstractTableModel 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
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben