2010-07-22 5 views
1

J'ai une JTable qui utilise un TableModel personnalisé pour afficher une série d'instances d'objet. Il y a un commutateur à l'intérieur getValueAt(int row, int column) pour renvoyer des valeurs en fonction d'attributs donnés (voir ci-dessous). Une déclaration de retour consiste à renvoyer une valeur de 1/0 comme vrai/faux.Changement de valeurs lors de la modification d'une cellule

Y at-il un moyen de modifier ce TableModel afin qu'il affiche un 1/0 quand une cellule est éditée?

public Object getValueAt(int row, int column) { 
    User user = (User)dataVector.get(row); 
    switch (column) { 
     case ID_INDEX: 
      return user.getId(); 
     case USERNAME_INDEX: 
      return user.getUserName(); 
     case PASSWORD_INDEX: 
      return "****"; 
     case ACTIVATED_INDEX: 
      return (user.getActivated())?"true":"false"; 
     default: 
      return new Object(); 
    } 
} 

Répondre

1

Le default renderer and editor for Boolean est un JCheckBox. Pensez à utiliser

case ACTIVATED_INDEX: 
    return Boolean.valueOf(user.getActivated()); 

Alternativement,

case ACTIVATED_INDEX: 
    return (user.getActivated())?"1":"0"; 

Addendum: À titre d'exemple, DefaultTableModel ne l'emporte pas sur getColumnClass() et AbstractTableModel retourne simplement Object.class. Votre TableModel devrait passer outre getColumnClass() en conséquence:

DefaultTableModel dtm = new DefaultTableModel() { 

    @Override 
    public Class<?> getColumnClass(int col) { 
     return getValueAt(0, col).getClass(); 
    } 
}; 
// add some data 
JTable table = new JTable(dtm); 
+0

Merci. Le TableModel que j'utilise semble produire une simple chaîne au lieu d'une JCheckBox. À partir du lien, il apparaît que le rendu utilisé dépend du résultat de 'getColumnClass()'. –

+0

@James P .: Oui, j'ai élaboré ci-dessus. – trashgod

1

Vous devez jeter un oeil à TableCellRenderer et TableCellEditor:

Un TableCellRenderer est chargé de rendre les données de la cellule lorsqu'elle est pas en cours d'édition, où comme TableCellEditor est responsable pour fournir un composant utilisé pour éditer la valeur d'une cellule. Vous pouvez donc représenter les données de deux manières différentes selon qu'elles sont en cours d'édition ou simplement restituées comme d'habitude. Vous devez toutefois considérer que si vous renvoyez un type booléen à partir de la méthode getValueAt(), votre JTable doit automatiquement afficher un JCheckBox, lorsque la cellule est en mode édition, la valeur JCheckBox peut être modifiée en cliquant dessus comme d'habitude . Pour ce faire, il suffit de retourner:

case ACTIVATED_INDEX: 
    return Boolean.valueOf(user.getActivated()); 
+1

Liens mis à jour et modifiés en TableCellRenderer et TableCellEditor. – trashgod

+0

Pas de soucis. Merci. – S73417H

Questions connexes