2009-05-27 6 views
0

J'utilise un JTable qui possède son propre moteur de rendu de cellules et un éditeur de cellules.Mise à jour du rendu de cellule après exécution d'une instance dérivée de DefaultCellEditor

Say, cette table contient 2 colonnes et x rangées:
La première colonne contient une valeur booléenne, son propre rendu cellulaire et éditeur de cellule (un radiobutton)
La deuxième colonne contient une valeur de chaîne, son propre moteur de rendu de cellule : il le rend gras lorsque la première colonne de la ligne courante est définie sur true (case cochée)

Toutes les valeurs sont correctement mises à jour par l'éditeur mais la 2ème ligne ne devient pas en gras lorsque le bouton radio est défini sur true ...
Je dois cocher une case d'une rangée différente pour voir les changements

Où puis-je tirer ces changements?

Vive et merci pour votre aide


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(); 
} 
} 

Répondre

1

Dans votre modèle de table chaque fois que votre valeur change, vous devez déclencher un événement approprié. Si votre modèle est hérité de AbstractTableModel, vous pouvez utiliser plusieurs méthodes fireXXX. Je suppose que vous devriez les appeler de la méthode setValueAt.

Si vous connaissez la colonne et la ligne exactes - vous pouvez appeler fireTableCellUpdated, sinon vous pouvez probablement utiliser fireTableChanged puisque vous devez mettre à jour une colonne différente.

Et bien sûr, votre rendu devrait rendre correctement la nouvelle valeur.

+0

Merci pour votre aide j'ai ajouté une déclaration de membre de la JTable que je référence quand j'appelle getTableCellEditorComponent. Ensuite, bien getCellEditorValue est appelé état I:. \t \t if (! Table = null) { \t \t \t ((AbstractTableModel) table.getModel()) fireTableDataChanged(); \t \t} –

+1

Même si cela fonctionne probablement, votre approche n'est pas correcte. vous devez appeler les méthodes fireXXX dans le modèle de table en réponse à la modification de DATA.En aucun cas vous ne devriez le faire dans le moteur de rendu ou l'éditeur. L'idée est simple. votre éditeur enregistrera une nouvelle valeur dans le modèle en utilisant la méthode model.setValueAt. Ensuite, le modèle devrait informer toutes les parties intéressées que les données ont changé. Vos moteurs de rendu et éditeurs réagiront automatiquement aux changements. –

0

Il ne semble pas avoir de sens pour y étendre DeafultCellEditor. Implémenter une interface d'écoute comme ça n'est pas une bonne idée.

Les transformateurs fonctionnent mieux en couche mince. Si une autre cellule doit changer, cela doit être reflété dans le modèle de table qui doit déclencher un événement de mise à jour pertinent.

+0

Alors pourriez-vous me dire comment coder correctement une telle chose? –

0

Je pense que cela pourrait aider les gens à un problème similaire, faire une true RadioButton unique dans une rangée, vous devrez étendre le DefaultTableModel à modifier son comportement en particulier la méthode setValueAt

Vive


/** 
* 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); 
}