2009-11-17 8 views
0

Je crée une application en Java. Je dois fournir un comportement supplémentaire lors de l'édition d'une cellule dans un JTable. Donc, idéalement, cela se produira lorsque la cellule perdra son focus après l'édition. Selon le post-traitement, je pourrais réinitialiser la valeur de la cellule. J'ai essayé d'utiliser un éditeur de cellules mais cela ne me donne pas le comportement désiré.Fournir un comportement supplémentaire lors de l'édition d'une cellule dans JTable

Dans JTable par défaut uniquement lorsque je double-clique sur une cellule, elle devient modifiable. Mais dans ma mise en œuvre de CellEditor, la cellule devient modifiable dès qu'elle est mise en évidence.

Voici le code pour My CellEditor personnalisé,

public class ParameterDefinitionEditor 
    extends AbstractCellEditor 
    implements TableCellEditor{ 

    private JTable table; 
    private DefaultTableModel defaultTableModel; 

public ParameterDefinitionEditor(DefaultTableModel defaultTableModel, 
JTable table) { 

     super(); 
     this.table = table; 
     this.defaultTableModel = defaultTableModel; 

     TableColumnModel columnModel = table.getColumnModel(); 
     columnModel.getColumn(0).setCellEditor(this); 

} 

    public Component getTableCellEditorComponent(JTable table, 
          Object value, 
         boolean isSelected, 
         int row, 
         int column) { 

     if (isSelected) { 
      // Do some processing. 
     } 

     ((JTextField)component).setText((String)value); 

     // Return the configured component 
     return component; 
    } 

    public Object getCellEditorValue() { 

     return ((JTextField)component).getText(); 
    } 


} 

Toute aide sera appréciée. Merci.

+0

pour l'enregistrement: il est une implémentation non valide de CellEditor - il _doit_ notifie son auditeur lors de l'édition est terminée pour raisons internes! – kleopatra

Répondre

2

Selon certains post-traitement I peut réinitialiser la valeur de la cellule.

Vous pouvez le faire directement dans l'éditeur de cellules si vous le souhaitez en remplaçant la méthode stopCellEditing().

Dans le défaut JTable seulement quand je Double-cliquez sur une cellule, il devient modifiable. Mais dans ma mise en œuvre de CellEditor la cellule devient modifiable dès qu'il est mis au point.

Étendez le DefaultCellEditor. Ceci est contrôlé par la méthode setClickCountToStart().

Donc, idéalement, cela se produira lorsque la cellule perd le focus après avoir modifié

Je suis d'accord avec l'autre suggestion que vous devriez probablement ajouterez le TableModelListener au TableModel. Bien que selon vos besoins, vous pouvez envisager d'utiliser le Table Cell Listener.

+0

J'aime vraiment l'exemple TableCellListener que vous avez mis en place sur le lien. Mais mon environnement est Java 1.5 donc en fait je ne peux pas utiliser l'utilitaire puisque "convertRowIndexToModel" n'est pas disponible en 1.5. Y at-il un travail autour? – Chantz

+0

Aussi pendant que nous y sommes, Y at-il un moyen de désactiver ce comportement pour certaines colonnes? – Chantz

1

Je ne pense pas en fournissant un éditeur de cellule personnalisé sert votre but. méthode

Si vous voulez faire un peu de traitement en fonction des actions de l'utilisateur, votre modèle de table devrait avoir
un ensemble d'auditeurs (qui mettent en œuvre TableModelListener) et votre logique devrait être mis
dans le « tableChanged ».

Cocher cette section tutoriel Swing ainsi:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

1

i atteint ce type de comportement en remplaçant stopCellEditing (i utilise une implémentation personnalisée de AbstractCellEditor)

public boolean stopCellEditing() 
{ 
String s = (String) getCellEditorValue(); 
if (! valueValidator.isValid(s)) 
    { 
    editorComponent.setBorder(new LineBorder(Color.red));   
    Toolkit.getDefaultToolkit().beep(); 
    return false; 
    } 
} 
else { ........