CellEditor und CellRenderer für eigene Klasse

Status
Nicht offen für weitere Antworten.

mas

Mitglied
Hallo,

Ich habe folgendes Problem:

Ich habe eine JTable mit verschiedenen Objekten in den einzelnen Spalten. Nun möchte ich für eine eigene Klasse Record den CellRenderer und den CellEditor anpassen damit in der Zelle eine JCheckBox ist, deren Wert die Variable 'recordable' repräsentiert.

Die Klasse Record (vereinfacht):

Code:
public class Record implements{

  private boolean recordable;
  private boolean recorded;

  public Record(){
    this.recordable = true;
    this.recorded = true;
   }
}

In der Klasse wo ich die JTable kreiere, setze ich die Renderer und Editoren für die Klasse Record:

Code:
table.setDefaultRenderer(Record.class, new RecordCellRenderer(true));
table.setDefaultEditor(Record.class, new RecordCellEditor());

Der Editor sieht folgendermassen aus:

Code:
public class RecordCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
    Record currentRecord;
    JCheckBox checkBox;

    public RecordCellEditor() {
        super();
        checkBox = new JCheckBox();
        checkBox.addActionListener(this);
        checkBox.setBorderPainted(false);
    }

    public void actionPerformed(ActionEvent e) {
        if(currentRecord.isRecordable()){
            currentRecord.setRecordable(false);
            checkBox.setSelected (false);
        }
        else{
            currentRecord.setRecordable(true);
            checkBox.setSelected (true);
        }
    }

    public Object getCellEditorValue() {
        return currentRecord;
    }

    public Component getTableCellEditorComponent(JTable table,
                                                 Object value,
                                                 boolean isSelected,
                                                 int row,
                                                 int column) {
        currentRecord = (Record)value;
        if(currentRecord.isRecordable()){
            currentRecord.setRecordable(false);
            checkBox.setSelected (false);
        }
        else{
            currentRecord.setRecordable(true);
            checkBox.setSelected (true);
        }
        return checkBox;
    }
}

Und so der Renderer:

Code:
public class RecordCellRenderer extends JLabel implements TableCellRenderer {
    Border unselectedBorder = null;
    Border selectedBorder = null;
    JCheckBox checkBox;
    boolean isBordered = true;

    public RecordCellRenderer(boolean isBordered) {
        this.isBordered = isBordered;
        setOpaque(true); //MUST do this for background to show up.
    }

    public Component getTableCellRendererComponent(JTable table, Object record, boolean isSelected, boolean hasFocus, int row, int column) {
        Record newRecord = (Record)record;
        checkBox = new JCheckBox();
        checkBox.setSelected(newRecord.isRecordable());
        add(checkBox);
        return this;
    }
}

Den Effekt den ich habe ist Folgender. Wenn ich die Zelle anklicke erscheint die Checkbox und wechselt ihren Status (checked, unchecked). Sobald ich aber die Zelle wieder verlasse (Anderen Button wählen oder andere Zelle) verschwindet die Checkbox sofort wieder.

Hat jemand eine Idee? Was mache ich falsch? Ich muss gestehen, dass ich durch die Editor/Renderer-Geschichte noch nicht ganz durchblicke und deshalb komme ich mit der Frage auch zu euch...

Vielen Dank für eure Hilfe! ???
 

matzze2000

Aktives Mitglied
Also ohne mich bisher mit deinem Quelltext auseinander gesetzt zu haben kann ich dir schonmal sagen, dass es wohl an dem Renderer liegt. Der ist nämlich für die Anzeige zuständig wenn die Zelle nicht editiert wird. Ich werde mal drüber gucken...
 

matzze2000

Aktives Mitglied
Du solltest es im Renderer mal so probieren:

Code:
public class RecordCellRenderer extends JLabel implements TableCellRenderer { 
    Border unselectedBorder = null; 
    Border selectedBorder = null; 
    JCheckBox checkBox; 
    boolean isBordered = true; 

    public RecordCellRenderer(boolean isBordered) { 
        this.isBordered = isBordered;
        checkBox = new JCheckBox();
        setOpaque(true); //MUST do this for background to show up. 
    } 

    public Component getTableCellRendererComponent(JTable table, Object record, boolean isSelected, boolean hasFocus, int row, int column) { 
        checkBox.setSelected((Boolean) value); //holt sich den Wert den die Zelle hat aus dem Tablemodel
        return checkBox; 
    } 
}

Also erstmal brauchst du ein Tablemodell in dem du die Werte verwaltest die jede Zelle hat. Wie du es geschrieben hast legst du für jede Zelle ein neues Objekt an, auf das du dann aber nich wirklich zugreifen kannst. Sowas machst du im Tablemodell, nicht im CellRenderer. Am besten guckst du dir mal das Tutorial zur JTable an, das hat mir auch sehr geholfen und da is auch das ganze Zeug mit dem CelRenderer sehr gut erklärt (is glaub ich auch ein Beispiel mit CheckBoxes dabei!)

http://www.java-forum.org/de/viewtopic.php?t=5321
 

mas

Mitglied
Hi,

Danke für Deine Hilfe. Natürlich habe ich ein Tablemodel und ein ColumnModel für meine Tabelle, das speichern und lesen der Werte, respektive das befüllen der Tabelle funktionieren auch gut. Für die anderen Spalten nehme ich aber den DefaultCellRenderer was ja für String, Integer, Boolean, JComboBox und JButton auch gut funktioniert. Wie ich das ganze aber mit einem eigenen Renderer mache habe ich noch nicht ganz geblickt.

So wie ich das sehe, hast Du nur folgendes angepasst:

Code:
public Component getTableCellRendererComponent(JTable table, Object record, boolean isSelected, boolean hasFocus, int row, int column) {
        checkBox.setSelected((Boolean) value); //holt sich den Wert den die Zelle hat aus dem Tablemodel
        return checkBox;
    }

Das ändert nichts an der Funktionalität, leider aber auch nicht an der Darstellung. Nach wie vor wird die Checkbox nur bei Klick auf die zelle direkt getoggelt und angezeigt.

Was ich möchte, ist, dass mein CellRenderer sich gleich verhält wie der DefaultCellRenderer eines Boolean-Werts, wobei eben die Variable 'recordable' jene sein soll, die durch die Checkbox repräsentiert wird.

Das Tutorial sehe ich mir gerade mal an.
 

mas

Mitglied
Ich habe mein Problem, gelöst, danke für die Hilfe.

Anmerkung: Ich muss keinen eigenen Renderer für die Klasse machen, wenn ich das TableModel entsprechend gestalte. Da gebe ich in der Methode getColumnClass den entsprechenden Klassentyp an (Boolean.class) und setze beim zurücklesen (Methode setValueAt) die entsprechende Variable (setRecordable(value))

Auf jeden Fall Danke.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
lumo SWT CellEditor & Popup AWT, Swing, JavaFX & SWT 3
lumo SWT Table CellEditor - knifflig AWT, Swing, JavaFX & SWT 35
D SWT JFace TableViewer nächster CellEditor nach Enter aktivieren AWT, Swing, JavaFX & SWT 5
dzim JFace ListViewer-Einträge mit CellEditor? AWT, Swing, JavaFX & SWT 3
R JTable: ploetzlich ist der CellEditor weg? :( AWT, Swing, JavaFX & SWT 4
G CellEditor - Kein "Textfeld" AWT, Swing, JavaFX & SWT 6
G JTable mit JComboBox als Celleditor, selectedRow falsch! AWT, Swing, JavaFX & SWT 3
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
V CellEditor der nur Eingaben int 1-9 und "null" er AWT, Swing, JavaFX & SWT 11
M CellEditor für individuelle Zellen in JTable AWT, Swing, JavaFX & SWT 3
J CellEditor per Button beenden AWT, Swing, JavaFX & SWT 2
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
S Verständnisproblem mit CellRenderer AWT, Swing, JavaFX & SWT 1
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
Spin CellRenderer Probleme bei JList AWT, Swing, JavaFX & SWT 4
S Swing Jlist - CellRenderer/ Selektion AWT, Swing, JavaFX & SWT 2
B JTable CellRenderer AWT, Swing, JavaFX & SWT 5
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
C Wieso funktionert der CellRenderer nicht? AWT, Swing, JavaFX & SWT 2
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
E Swing JTable mit CellRenderer AWT, Swing, JavaFX & SWT 7
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
? Tabelle formatieren - auch ohne CellRenderer? AWT, Swing, JavaFX & SWT 6
H JTable und CellRenderer AWT, Swing, JavaFX & SWT 2
M CellRenderer in JTable AWT, Swing, JavaFX & SWT 11
D JList Cellrenderer fügt mehrfach ein AWT, Swing, JavaFX & SWT 2
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
K Verständnisfrage zum CellRenderer AWT, Swing, JavaFX & SWT 4
G [Problem] CellRenderer und ActionCommand AWT, Swing, JavaFX & SWT 5
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
G CellRenderer, der einige ImageIcons aneinanderreiht AWT, Swing, JavaFX & SWT 5
G JTable: Zellenhöhe mit neuem CellRenderer & Editor AWT, Swing, JavaFX & SWT 17
G CellRenderer funkt net AWT, Swing, JavaFX & SWT 5
T CellRenderer funzt net AWT, Swing, JavaFX & SWT 20
F JTable CellRenderer über boolean AWT, Swing, JavaFX & SWT 12
M Krieg keine CellRenderer Methode hin :( AWT, Swing, JavaFX & SWT 12
C JTable mit JPanel als CellRenderer AWT, Swing, JavaFX & SWT 2
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben