Guten Abend!
Ich experimentiere gerade mit einer jTable und lade Informationen aus einer Datenbank (SQLite und Derby, bei beiden tritt der Fehler auf) in dieselbe.
Eine der Spalten in der Datenbank hat den Typ Boolean und ich achte darauf, dass ich die Spalte auch streng so behandle, jedoch zeigt mit die jTable einen String und keine CheckBox an, wie sie eigentlich sollte (vgl. How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components))
Mein Code beim Füllen sieht so aus (aufs Wesentliche reduziert):
Beim Insert gibt es ein PreparedStatement mit setBoolean und der Tabellenvektor erkennt soweit ich feststellen kann auch alles als String oder Boolean.
Die Tabelle weniger, deshalb habe ich beschlossen, dass getClass etwas zu "modifizieren":
Vom Ergebnis bin ich etwas überrascht. Meine Tabelle hat 6 Spalten, davon ist die 3. (wenn man von 0 beginnt die 2.) die Boolean-Spalte.
Merkwürdigerweise sieht die Ausgabe der getColumnClass so aus:
Und ich bekomme den Fehler:
Wenn ich es mit der Standardvariante ausführe (obwohl diese eigentlich dasselbe Ergebnis liefern sollte) lautet die Ausgabe hier:
Und alles läuft - bis auf die CheckBox.
Dies ist übrigens die gesamte Ausgabe. Obwohl es 6 Spalten gibt geht die getColumnClass-Variante nur von 0-3. Mit der Standardvariante bin ich auch über die einzelnen Spalten gegangen, um herauszufinden, ob da alles so läuft, wie es sollte.
Auf die Spalten 5+6 wird jedoch nicht reagiert, möglicherweise weil sie ComboBoxen sind (funktionieren einwandfrei).
Hat jemand eine Idee, warum die Boolean-Checkboxen nicht angezeigt werden?
Danke im Voraus!
Ich experimentiere gerade mit einer jTable und lade Informationen aus einer Datenbank (SQLite und Derby, bei beiden tritt der Fehler auf) in dieselbe.
Eine der Spalten in der Datenbank hat den Typ Boolean und ich achte darauf, dass ich die Spalte auch streng so behandle, jedoch zeigt mit die jTable einen String und keine CheckBox an, wie sie eigentlich sollte (vgl. How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components))
Mein Code beim Füllen sieht so aus (aufs Wesentliche reduziert):
Java:
cache = new Vector<Object[]>();
ResultSet rs = Abfrage();
while (rs.next()) {
Object[] record = new Object[colCount];
for (int i = 0; i < colCount; i++) {
switch (i) {
case 2:
System.out.println("Case 2");
try {
record[i] = new Boolean(rs.getBoolean(i + 1));
} catch (Exception e) {
System.out.println("Problem beim Füllen von Boolean");
System.out.println(e.getMessage());
System.out.println(e.getLocalizedMessage());
System.out.println(e.getClass());
record[i] = new Boolean(false);
}
break;
default:
System.out.println("case "+i);
record[i] = rs.getString(i + 1);
}
}
cache.addElement(record);
}
fireTableChanged(null); // notify everyone that we have a new table.
Beim Insert gibt es ein PreparedStatement mit setBoolean und der Tabellenvektor erkennt soweit ich feststellen kann auch alles als String oder Boolean.
Die Tabelle weniger, deshalb habe ich beschlossen, dass getClass etwas zu "modifizieren":
Java:
@Override
public Class<?> getColumnClass(int column) {
System.out.println("col: -->"+column+" Klasse: "+getValueAt(0, column).getClass());
return getValueAt(0, column).getClass();
}
Vom Ergebnis bin ich etwas überrascht. Meine Tabelle hat 6 Spalten, davon ist die 3. (wenn man von 0 beginnt die 2.) die Boolean-Spalte.
Merkwürdigerweise sieht die Ausgabe der getColumnClass so aus:
Code:
col: -->0 Klasse: class java.lang.String
col: -->1 Klasse: class java.lang.String
col: -->2 Klasse: class java.lang.Boolean
col: -->3 Klasse: class java.lang.String
col: -->0 Klasse: class java.lang.String
col: -->1 Klasse: class java.lang.String
col: -->2 Klasse: class java.lang.Boolean
Und ich bekomme den Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5413)
at javax.swing.JTable.prepareRenderer(JTable.java:5736)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2108)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2010)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1806)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:765)
Etc, jedoch ohne Angabe, wo im Code der Hund begraben liegt
Wenn ich es mit der Standardvariante ausführe (obwohl diese eigentlich dasselbe Ergebnis liefern sollte) lautet die Ausgabe hier:
Code:
col: 0 class: class java.lang.Object
col: 1 class: class java.lang.Object
col: 2 class: class java.lang.Object
col: 3 class: class java.lang.Object
col: 0 class: class java.lang.Object
col: 1 class: class java.lang.Object
col: 2 class: class java.lang.Object
col: 3 class: class java.lang.Object
Dies ist übrigens die gesamte Ausgabe. Obwohl es 6 Spalten gibt geht die getColumnClass-Variante nur von 0-3. Mit der Standardvariante bin ich auch über die einzelnen Spalten gegangen, um herauszufinden, ob da alles so läuft, wie es sollte.
Auf die Spalten 5+6 wird jedoch nicht reagiert, möglicherweise weil sie ComboBoxen sind (funktionieren einwandfrei).
Hat jemand eine Idee, warum die Boolean-Checkboxen nicht angezeigt werden?
Danke im Voraus!