2009-05-27 8 views
0

Ich benutze eine JTable die einen eigenen CellRenderer und Cell Editor hat.Aktualisiere CellRenderer nachdem eine DefaultCellEditor abgeleitete Instanz seine Aufgabe erledigt

Say enthält diese Tabelle 2 Spalten und x Reihen:
Die erste Spalte enthält einen Booleschen Wert, seine eigene Zellenwiedergabe und Zelleditor (a RadioButton-)
Die zweite Spalte enthält einen Stringwert, eine eigene Zelle Renderer : Es wird fett dargestellt, wenn die erste Spalte der aktuellen Zeile auf "True" gesetzt ist (Optionsfeld markiert)

Alle Werte werden vom Editor korrekt aktualisiert, aber die zweite Zeile wird nicht fett, wenn das Optionsfeld auf "True" gesetzt ist ...
Ich muss ein Optionsfeld aus einer anderen Zeile überprüfen, um die Änderungen zu sehen

Wo kann ich diese Änderungen auslösen?

Beifall und Dank für Ihre Hilfe


RadiobuttonTableCellEditor.java

public class RadiobuttonTableCellEditor extends DefaultCellEditor 
            implements ItemListener { 
JRadioButton rb = new JRadioButton(); 

public RadiobuttonTableCellEditor(JCheckBox pCheckBox) { 
    super(pCheckBox); 
} 

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
    if (value == null) 
     return null; 
    rb.addItemListener(this); 
    rb.setSelected((Boolean)value); 
    return rb; 
} 

public void itemStateChanged(ItemEvent e) { 
    super.fireEditingStopped(); 
} 

public Object getCellEditorValue() { 
    rb.removeItemListener(this); 
    return rb.isSelected(); 
} 
} 

Antwort

1

Wenn sich Ihr Wert ändert, müssen Sie in Ihrem Tabellenmodell entsprechende Ereignisse auslösen. Wenn Ihr Modell von AbstractTableModel geerbt wird, können Sie mehrere fireXXX Methoden verwenden. Ich schätze, Sie sollten sie von setValueAt Methode anrufen.

Wenn Sie genau wissen, Spalte und Zeile - Sie können fireTableCellUpdated aufrufen, sonst können Sie wahrscheinlich fireTableChanged verwenden, da Sie verschiedene Spalte aktualisieren müssen.

Und natürlich Renderer sollte richtig Wert neu rendern.

+0

Danke für Ihre Hilfe Ich habe eine Member-Deklaration der JTable hinzugefügt, die ich referenziere, wenn ich getTableCellEditorComponent aufruft. Dann gut getCellEditorValue heißt I-Zustand. \t \t if (! Table = null) { \t \t \t ((Abstract) table.getModel()) fireTableDataChanged(); \t \t} –

+1

Obwohl es wahrscheinlich funktioniert, ist Ihr Ansatz nicht korrekt. Sie sollten die fireXXX-Methoden im Tabellenmodell als Reaktion auf das Ändern von DATA aufrufen.In keinem Fall sollten Sie dies im Renderer oder Editor tun. Die Idee ist einfach. Ihr Editor speichert mit der model.setValueAt-Methode einen neuen Wert im Modell. Dann sollte das Modell alle interessierten Parteien wissen lassen, dass sich die Daten geändert haben. Ihre Renderer und Editoren reagieren auf Änderungen automatisch. –

0

Es scheint keinen Sinn machen DeafultCellEditor dort zu verlängern. Eine solche Listener-Schnittstelle zu implementieren ist ebenfalls keine gute Idee.

Renderer funktionieren am besten als dünne Schicht. Wenn sich eine andere Zelle ändern sollte, muss dies in dem Tabellenmodell widergespiegelt werden, das ein relevantes Aktualisierungsereignis auslösen sollte.

+0

Also würden Sie mir bitte sagen, wie man so etwas richtig programmiert? –

0

Ich denke, es Menschen mit einem ähnlichen Problem helfen könnte, machen Sie ein true RadioButton- einzigartig in einer Reihe, werden Sie die DefaultTableModel erweitern müssen, um ihr Verhalten vor allem der setValueAt Methode

Beifall ändern


/** 
* When <code>column</code> is the column that contains the Boolean (in fact the radio button): 
* If aValue == false and that it had a previous value set to true we don't do anything 
* If aValue == true and that it had a previous value set to false, we set all the other booleans to false and this one to true 
*/ 
@Override 
public void setValueAt(Object aValue, int row, int column) { 
    if (column == colonneBoutonradio) 
    { 
     if (((Boolean)aValue && !(Boolean)super.getValueAt(row, column))) 
      for (int i = 0; i < this.getRowCount(); i++) 
       // i==row permet de vérifier si la ligne courante est celle à modifier (et donc celle à mettre à true) 
       super.setValueAt(i==row, i, colonneBoutonradio); 
    } 
    else 
     super.setValueAt(aValue, row, column); 
} 
Verwandte Themen