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
 

jagdfalke

Bekanntes Mitglied
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
 

Timmah

Bekanntes Mitglied
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"))
{

}
 

Sky

Top Contributor
Für die Anzeige ist immer noch der Renderer zuständig. In der get...-Methode bekommste den value sogar frei Haus geliefert...
 

jagdfalke

Bekanntes Mitglied
Also wenn du auch ne CheckBox zur Anzeige haben willst und zur Bearbeitung muss du dir nen Renderer und nen Editor schreiben.

mfg
jagdfalke
 

Timmah

Bekanntes Mitglied
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;
            }
        }
    }
 

Mag1c

Top Contributor
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
 

Timmah

Bekanntes Mitglied
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:
 

Mag1c

Top Contributor
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
 

Timmah

Bekanntes Mitglied
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.
 

Mag1c

Top Contributor
hmm,

vielleicht stimmt die Reihenfolge nicht ?

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

Gruß
Mag1c
 

Timmah

Bekanntes Mitglied
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...
 

Mag1c

Top Contributor
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
 

Timmah

Bekanntes Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
B TableCellRenderer rendert Integer/Boolean Felder nicht AWT, Swing, JavaFX & SWT 4
M JavaFX TableView mit CheckBox als Boolean AWT, Swing, JavaFX & SWT 5
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
Z Swing JTable: Boolean Renderer AWT, Swing, JavaFX & SWT 3
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
V JTable - farbige Boolean-Felder - geht das? AWT, Swing, JavaFX & SWT 3
G Action.setCheck(boolean)? AWT, Swing, JavaFX & SWT 6
E JComboBox Methode setItemEnabeld(boolean) AWT, Swing, JavaFX & SWT 6
F JTable CellRenderer über boolean AWT, Swing, JavaFX & SWT 12
R JTable - Boolean-Wert aus Zelle auslesen. AWT, Swing, JavaFX & SWT 9
hdi SWT FileDialog wird an scheinbar beliebiger Position angezeigt AWT, Swing, JavaFX & SWT 2
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
D JLabel mit fester Breite und beliebiger Höhe AWT, Swing, JavaFX & SWT 4
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
B An beliebige Stelle des Bildschirms zeichnen AWT, Swing, JavaFX & SWT 28
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
G Bild an vorgegebene stelle im Fenster stzen AWT, Swing, JavaFX & SWT 18
D JTextField an bestimmter Stelle setzen? AWT, Swing, JavaFX & SWT 6
G JComboBox mit leerzeichen an erster stelle AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen


Oben