Aktualisieren CellRenderers nach einer DefaultCellEditor abgeleitete Instanz macht seinen Job

StackOverflow https://stackoverflow.com/questions/917105

  •  06-09-2019
  •  | 
  •  

Frage

Ich verwende eine JTable, die ihre eigene Zelle Renderer und Zell Redakteur.

Sag mal, enthält diese Tabelle 2 Spalten und x Reihen:
Die erste Spalte enthält einen Booleschen Wert, seine eigene Zelle Rendering und Zelleditor (a Radiobutton)
Die zweite Spalte enthält einen Stringwert, eine eigene Zelle Renderer: es macht es fett, wenn die erste Spalte der aktuellen Zeile auf true gesetzt ist (RadioButton- geprüft)

Alle werden die Werte korrekt durch den Editor aktualisiert, aber die zweite Zeile fett nicht, wenn das Optionsfeld auf true gesetzt ist ...
Ich habe ein Optionsfeld aus einer anderen Zeile zu überprüfen, um die Änderungen zu sehen

Wo kann ich thoses Änderungen Feuer?

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();
}
}
War es hilfreich?

Lösung

In Ihrem Tabellenmodell, wenn Ihr Wert ändert Sie entsprechende Ereignis ausgelöst haben. Wenn Ihr Modell von AbstractTableModel geerbt ist, können Sie mehrere fireXXX Methoden. Meine Vermutung ist, dass Sie sie von setValueAt Methode aufrufen sollte.

Wenn Sie genaue Spalte und Zeile kennen -. Sie können fireTableCellUpdated nennen, sonst kann man Sie wahrscheinlich fireTableChanged verwenden, da Sie andere Spalte aktualisieren müssen

Und natürlich Renderer Sie sollten richtig neuen Wert machen.

Andere Tipps

Es scheint keinen Sinn machen DeafultCellEditor dort zu verlängern. ein Listener-Interface wie das Implementieren ist auch keine gute Idee.

Renderer funktioniert am besten als eine dünne Schicht. Wenn sollte eine andere Zelle ändern, dann das muss in der Tabelle Modell reflektiert werden, die ein entsprechendes Update-Ereignis ausgelöst werden sollen.

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

ändern

Prost


/**
 * 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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top