Boolean an beliebiger Stelle in Tabelle

Status
Nicht offen für weitere Antworten.

Timmah

Bekanntes Mitglied
Hi Leute,

ich habe eine Tabelle, in der in Spalte 0 in unregelmäßigen Abständen eine CheckBox erscheinen soll. Das soll abhängig davon sein, ob in dem DataVector des Tabellenmodels "true"/"false" oder etwas anderes steht.
Wenn also true oder false darin steht, soll die Checkbox, und wenn nicht der Text erscheinen.

Ich habe mich durch das JTable Tutorial durchgearbeitet, doch keine Möglichkeit gesehen abhängig von dem Inhalt der Zelle die Class festzulegen.
In meinem Tabellenmodel vom Typ DefaultTableModel gibt es ja keine Methode, die mir den Wert der aktuellen Zelle liefert. Die aktuelle Zeile wird mir ebenfalls nicht zur Verfügung gestellt, oder irre ich da? Dann könnte ich ja mit getValue(row,column) darauf zugreifen...

Vielen Dank schonmal für eure Hilfe
 
Warum sollte DefaultTableModel keine Methoden haben um auf Zelleninhalte zuzugreifen? Ich seh da spontan getValueAt(int, int) in der API. Um da ne Checkbox hinzumachen gibts doch den CellEditor aber ich weiß nicht ob man den auf einzelne Zellen anwenden kann.

mfg
jagdfalke
 
Ja, es gibt getValueAt(row,column), aber woher bekomme ich die row? Diese wird vom Model nicht zur Verfügung gestellt..

Also ich bräuchte sowas in der Art

Code:
if(getValueAt(row,0).equals("true"))
{

}
 
Für die Anzeige ist immer noch der Renderer zuständig. In der get...-Methode bekommste den value sogar frei Haus geliefert...
 
Also wenn du auch ne CheckBox zur Anzeige haben willst und zur Bearbeitung muss du dir nen Renderer und nen Editor schreiben.

mfg
jagdfalke
 
Ich habe mal ein Bisschen mit dem Renderer und dem Editor rumgespielt, doch irgendwie erreiche ich nicht das, was ich will...

· Die CheckBox erscheint nur, wenn ich einmal in die Zelle geklickt habe
· Die CheckBox kann ich nicht auswählen
· Die Werte der Textfelder bleiben nicht erhalten

Evtl. kann mir ja irgendjemand nach dem unten gewünschten Muster den Renderer und Editor schreiben; das wäre super 🙂


Code:
   private class MyTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer
    {

        Component comp = null;
        private JCheckBox check;
        private JTextField feld;

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (value.equals("Gesamt"))
            {
                setFont(fontFett);
                return this;
            }
            else if (value.equals("false") || value.equals("true"))
            {
                check = new JCheckBox();
                return check;
            }
            else if (column == 6 || column == 7 || column == 8)
            {
                feld = new JTextField();
                return feld;
            }
            else
            {
                return this;
            }
        }
    }

    private class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
    {

        Component comp;

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            if (column == 0)
            {
                if (value.equals("false"))
                {
                    comp = new JCheckBox("LALALA");
                }
                else
                {
                    comp = new JTextField();
                }
            }
            return comp;
        }

        public Object getCellEditorValue()
        {
            // TODO Auto-generated method stub
            if (comp instanceof JCheckBox)
            {
                return ((JCheckBox) comp).getText();
            }
            else if (comp instanceof JTextField)
            {
                return ((JTextField) comp).getText();
            }
            else
            {
                return null;
            }
        }
    }
 
Hi,

mit dem Renderer könnte man das so oder so ähnlich machen:

Code:
    public class MyTableCellRenderer extends DefaultTableCellRenderer {

        private TableCellRenderer booleanRenderer = null;

        public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof String && ("true".equalsIgnoreCase((String) value) || "false".equalsIgnoreCase((String) value))) {
                if (booleanRenderer == null) {
                    booleanRenderer = table.getDefaultRenderer(Boolean.class);
                }
                return booleanRenderer.getTableCellRendererComponent(table, new Boolean((String) value), isSelected, hasFocus, row, column);
            }
            else {
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }
    }

Gruß
Mag1c
 
Okay danke.

Doch auch hier steht zuerst "false" in der Zelle, und erst, wenn man die Zelle das erste mal ausgewählt hat, ist dort eine CheckBox.

Und da man die Checkbox auch auswählen können soll, brauch ich ja sicherlich noch einen Editor, oder? Hast du den auch gerade parat :lol:
 
Hi,

dann benutzt du den Renderer falsch. Für meinen Test habe ich das so gemacht:

Code:
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());

Mit dem Editor müsste das ganz ähnlich gehen. Habe gerade keine Zeit, das auszuprobieren.

Gruß
Mag1c
 
Genauso mache ich das auch, und trotzdem erscheint die Checkbox wie gesagt erst, nachdem ich sie einmal ausgewähllt, und wieder abgewählt habe. Außerdem verschwindet sie wieder, wenn ich erneut reinklicke.
 
hmm,

vielleicht stimmt die Reihenfolge nicht ?

1. Tabelle erzeugen
2. Renderer setzten
4. GUI zusammenbauen.

Gruß
Mag1c
 
Mein Fehler. Wenn ich dem Datavector nicht new Boolean(false), sondern den primitiven boolean Datentyp hinzufüge, geht es.

Nun brauch ich nur noch den Editor, da ich so beim Auswählen der Zelle wieder false drin stehen habe.

Edit: Ich habe mich eben am Editor versucht, doch komme da irgendwie nicht richtig zum Erfolg.



Code:
    private class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
    {

        TableCellEditor editor = null;
        Object valueGlobal;
        Component comp;

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            valueGlobal = value;
            // System.out.println("VALUE GLOBAL " + valueGlobal);
            if (column == 0)
            {
                if (value instanceof String && ("true".equalsIgnoreCase((String) value) || "false".equalsIgnoreCase((String) value)))
                {
                    if (editor == null)
                    {
                        editor = table.getDefaultEditor(Boolean.class);
                    }
                    valueGlobal = valueGlobal.equals("true") ? "false" : "true";
                    return editor.getTableCellEditorComponent(table, new Boolean((String) value), isSelected, row, column);
                }
                else
                {
                    return comp;
                }
            }
            else if ((column == 6 || column == 7 || column == 8) && !value.equals("Zwischensumme"))
            {
                editor = table.getDefaultEditor(Float.class);
                valueGlobal = value;
                return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
            }
            else
            {
                if (editor == null)
                {
                    editor = table.getDefaultEditor(String.class);
                }
                valueGlobal = value;
                return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
            }
        }

        public Object getCellEditorValue()
        {
            // TODO Auto-generated method stub
            return valueGlobal;
        }
    }

In der ersten Spalte wird zumindest nun schonmal abhängig von dem Inhalt die Checkbox angezeigt, und man kann diese auch auswählen.

Doch das, was ich in die Zellen schreibe bleibt nicht erhalten. Außerdem kann man die Zeile, wo "Zwischensumme" steht, auch noch etwas reinschreiben...
 
Hi,

deine "getCellEditorValue" ist falsch. Diese muß den Wert aus der Editor-Komponente liefern. Die Tabelle holt den und schreibt ihn dann per "setValueAt" ins TableModel. Du solltest dir die Komponente, die bei "getTableCellEditorComponent" zurückgegeben wird, merken und aus dieser dann den Wert liefern.

Welche Zellen editierbar sein sollen, legst du im TableModel mit der Methode "isCellEditable" fest.

Wenn du echte Boolean-Objekte im Model hast, kannst du dir die Sache einfacher machen. Nimm eine eigene Tabelle und laß den ganzen Kram mit den Renderern und Editoren erstmal weg:

Code:
    public class MyTable extends JTable {
        private boolean isCellBoolean (int row, int column) {
            return getValueAt(row, column) instanceof Boolean;
        }

        public TableCellRenderer getCellRenderer (int row, int column) {
            return isCellBoolean(row, column) ? getDefaultRenderer(Boolean.class) : super.getCellRenderer(row, column);
        }

        public TableCellEditor getCellEditor (int row, int column) {
            return isCellBoolean(row, column) ? getDefaultEditor(Boolean.class) : super.getCellEditor(row, column);
        }
    }

Gruß
Mag1c
 
Super, ich danke dir 🙂

So funktioniert das nun so, wie ich es wollte. Vielen dank für deine Mühen :toll:

Gruß Timmah
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben