JTable: mehrere Werte in einer Spalte

Crazy Bytes

Mitglied
Hallo,

ich habe folgendes Problem: Ich muss mehrere Werte verschiedenen Typs (Boolean, Double, Long, String) in einer Spalte ausgeben. Leider richtet sich das JTable immer nach dem ersten Wert in der Spalte, so dass alle folgenden Werte in der Spalte als gleicher Typ des ersten Wertes behandelt werden, z.B. Boolean wenn der erste Wert ein Boolean ist.

Ich habe jetzt schon verschiedene Ansätze versucht, ich habe einen eigenen CellRenderer und CellEditor geschrieben. Bei der einfachen Anzeige der Werte stellt der CellRenderer die Daten auch richtig dar, wähle ich dann aber eine Zelle zum Bearbeiten aus, bekomme ich eine ClassCastException. Ich vermute das es am CellEditor liegt oder an der überschriebenen Methode prepareEditor() in meinen JTable liegt.

Hat irgendeiner eine Idee wie ich das Problem lösen kann?

Code:
// Class myJTable:
public class myJTable extends JTable {
    public myJTable () {
        setCellEditor(new myCellEditor(new JTextField()));
    }

    public Component prepareEditor(TableCellEditor editor, int row, int col) {
        Component comp = super.prepareEditor(editor, row, col);
        // Die Tabelle hat IMMER 16 Zeilen, die den in der Abfrage dargestellten
        // Aufbau haben
        if(row == 0 || row == 3){
            JCheckBox box = (JCheckBox)comp;
            box.setEnabled(true);
        }
        if(row == 1 || row == 2 || row == 4 || row == 5 || row == 6
          || row == 7 || row == 8 || row == 9 || row == 10
          || row == 11 || row == 12 || row == 13 || row == 14 || row == 15) {
            JTextField tf = (JTextField)comp;
            tf.setDocument(new PlainDocument());
            tf.selectAll();
            tf.setCaretPosition(0);
        }
        return comp;
    }
}

// Class myCellEditor
public class myCellEditor extends DefaultCellEditor {
    public myCellEditor (JTextField jtf) {
        super(jtf);
        setClickCountToStart(2);
    }

    public myCellEditor (JCheckBox chk) {
        super(chk);
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        if(value instanceof Boolean) {
            return new JCheckBox("", ((Boolean) value).booleanValue());
        } else {
            return super.getTableCellEditorComponent(table, value, isSelected, row, column);
        }
    }
}

Vielen Dank schon mal für Eure Hilfe.
Bis dann...
CB
 
Ich erhalte folgende Exception-Meldung:
Exception occurred during event dispatching:
java.lang.ClassCastException
at com.crazy-bytes.gui.myJTable.prepareEditor(myJTable.java:18)
at javax.swing.JTable.editCellAt(JTable.java:2520)
at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.adjustFocusAndSelection(BasicTableUI.java:510)
at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.mousePressed(BasicTableUI.java:494)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:218)
at java.awt.Component.processMouseEvent(Component.java:5131)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3162)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:140)

Bis dann...
CB
 
Zuletzt bearbeitet:
Original geschrieben von Crazy Bytes
Ich erhalte folgende Exception-Meldung:
Exception occurred during event dispatching:
java.lang.ClassCastException
at com.crazy-bytes.gui.myJTable.prepareEditor(myJTable.java:18)
at javax.swing.JTable.editCellAt(JTable.java:2520)
at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.adjustFocusAndSelection(BasicTableUI.java:510)
at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.mousePressed(BasicTableUI.java:494)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:218)
at java.awt.Component.processMouseEvent(Component.java:5131)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3162)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:140)

Bis dann...
CB

Benutzt Du keine IDE? Dann zeigt er sofort an, an welcher Stelle genau der Fehler auftritt. In Deinem Fall in der Methode prepareEditor(...), und zwar in Zeile 18.
Ich vermute, bei diesem Konstrukt

Code:
public Component prepareEditor(TableCellEditor editor, int row, int col) {
        Component comp = super.prepareEditor(editor, row, col);
        // Die Tabelle hat IMMER 16 Zeilen, die den in der Abfrage dargestellten
        // Aufbau haben
        if(row == 0 || row == 3){
            JCheckBox box = (JCheckBox)comp;
            box.setEnabled(true);
        }
        if(row == 1 || row == 2 || row == 4 || row == 5 || row == 6
          || row == 7 || row == 8 || row == 9 || row == 10
          || row == 11 || row == 12 || row == 13 || row == 14 || row == 15) {
            JTextField tf = (JTextField)comp;

wird es an mindestens einer der beiden fett markierten Stellen knallen. Lass Dir doch zu Debugzwecken ausgeben, von welchem Typ die comp ist, und lass weitere Aktionen daran erst einmal weg.
 
Also der Fehler geschieht in der Zeile

Code:
JTextField tf = (JTextField)comp;

Wie gesagt die Werte erscheinen in folgender Reihenfolge: Boolean, String, String, Boolean, Long, Long, String, ..., String.

Boolean Werte werden als JCheckBox angezeigt. versuche ich nun einen Wert zu ändern der kein Boolean is, bekomme ich eine ClassCastException, weil versucht wird eine JCheckBox in ein JTextField zu casten. Das bedeutet das auch die anderen Werte als Boolean behandelt werden.

Wie kann ich das ändern / verhindern?
Bis dann...
CB
 
Original geschrieben von Crazy Bytes
Also der Fehler geschieht in der Zeile

Code:
JTextField tf = (JTextField)comp;


Wie gesagt die Werte erscheinen in folgender Reihenfolge: Boolean, String, String, Boolean, Long, Long, String, ..., String.

Boolean Werte werden als JCheckBox angezeigt. versuche ich nun einen Wert zu ändern der kein Boolean is, bekomme ich eine ClassCastException, weil versucht wird eine JCheckBox in ein JTextField zu casten. Das bedeutet das auch die anderen Werte als Boolean behandelt werden.

Wie kann ich das ändern / verhindern?
Bis dann...
CB

Vielleicht stehe ich ja auf der Leitung, aber was ist mit einem einfachen instanceof-Abgleich?

Code:
if ( comp instanceof JTextField )
{
  JTextField tf = (JTextField)comp;
  tf.setDocument(new PlainDocument());
  tf.selectAll();
  tf.setCaretPosition(0);
// usw. beliebiger Code
}
if ( comp instanceof JCheckBox )
{
        JCheckBox box = (JCheckBox)comp;
        box.setEnabled(true);
}
 
Danke, hab den Wald mal wieder vor lauter Bäumen nicht gesehen.

Die editierung klappt jetzt. aber er übernimmt die werte nicht, das werde ich aber irgendwie selbst zurecht frickeln.

Bis dann...
CB
 
Original geschrieben von Crazy Bytes
Danke, hab den Wald mal wieder vor lauter Bäumen nicht gesehen.

Die editierung klappt jetzt. aber er übernimmt die werte nicht, das werde ich aber irgendwie selbst zurecht frickeln.

Bis dann...
CB

Jo, ähnliche Vorgehensweise dann in setValueAt(...) zur Datenübernahme.
 
Zurück