2009-09-11 10 views

Répondre

3

Vous pouvez créer un TableCellEditor personnalisé pour votre table. Cette classe aura une variable d'instance d'un TextField, appelons le textField. Ensuite, la méthode getTableCellEditorComponent pourrait ressembler à ceci:

public Component getTableCellEditorComponent(JTable table, Object value, 
          boolean isSelected, int row, int column) { 
    textField.setText(value.toString()); 
    textField.selectAll(); 
    return textField; 
} 
+0

Très bonne solution. Je vous remercie! –

+1

Je ne pense pas que cette solution fonctionnera dans tous les cas ... essayez d'enrouler selectAll dans SwingUtilities.invokeLater (new Runnable() {public void Run() {textField.selectAll();}}); Et n'oubliez pas de rendre textField final. – Jason

-1

Vous devriez regarder extJS. Il existe cependant une courbe d'apprentissage assez raide.

+0

J'ai trouvé travaille ExtJS avec java script et il est GPL liscence. J'ai besoin d'au moins une Liscence LGPL. –

2

Création d'un éditeur personnalisé fonctionne très bien si vous n'avez jamais données chaîne dans la table et seulement besoin d'un seul éditeur. Toutefois, si vous disposez de plusieurs types de données différents, tels que Chaîne, Entier, Double, devises, pourcentages, etc., qui utilisent tous un JTextField en tant qu'éditeur, vous devez créer plusieurs éditeurs personnalisés.

Vous pouvez lire sur le Table Select All Editor pour une autre solution possible.

+0

Grands Merci votre solution fonctionne parfaitement pour moi mais je veux montrer le curseur après l'édition, comment est-ce possible. Cela nécessite un clic après avoir édité pour afficher le curseur. @Camickr –

1

Notez qu'il existe également une autre possibilité, vous pouvez remplacer JTable # prepareEditor comme ce qui suit:

@Override 
public Component prepareEditor(TableCellEditor editor, int row, int column) { 
    Component c = super.prepareEditor(editor, row, column); 
    if (c instanceof JTextComponent) { 
     ((JTextComponent) c).selectAll(); 
    } 
    return c; 
} 
+0

cela ne fonctionne pas du tout –

0

La solution ci-dessus fonctionne pas lors de l'édition est lancée par un clic de souris. Pour certaines personnes, la solution consiste à appeler selectAll() dans un invokeLater() afin que le texte soit sélectionné après l'envoi des événements de souris, mais cela ne fonctionne pas pour moi (probablement parce que j'utilise Substance look and feel)

internes Swing obtenir un événement mouseReleased() plus tard et changer à nouveau le caret, comme le montre cette trace de la pile:

at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source) 
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source) 
at javax.swing.text.JTextComponent$MutableCaretEvent.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(Unknown Source) 

Voici ma solution: Écouter de la position caret changements, et la première fois que la sélection va de tous sélectionnés à Aucun n'est sélectionné après le début de l'édition de la cellule, appelez à nouveau selectAll(). L'écouteur caret peut être installé par un éditeur de cellule personnalisé comme indiqué ici, ou dans une méthode editCellAt() substituée dans un JTable personnalisé.

private class SelectAllCellEditor extends DefaultCellEditor 
{ 
    public SelectAllCellEditor(JTextField tf) 
    { 
     super(tf); 
    } 

    /** 
    * Flag to ensure we only install the caret listener on the editor once. 
    */ 
    boolean listenerInstalled = false; 
    /** 
    * Primes the caret listener to override deselection when the first mouseReleased() event is reposted to the editor. 
    */ 
    boolean overrideDeselection = false; 

    @Override 
    public Component getTableCellEditorComponent(JTable table , Object value , boolean isSelected , int row , int column) 
    { 
     final JFormattedTextField tf = (JFormattedTextField) super.getTableCellEditorComponent(table , value , isSelected , row , column); 

     if(!listenerInstalled) 
     { 
      tf.addCaretListener(new CaretListener() 
      { 
       int lastDot  = 0; 
       int lastMark = 0; 

       @Override 
       public void caretUpdate(CaretEvent e) 
       { 
        if(overrideDeselection) 
        { 
         int length = tf.getText() == null ? 0 : tf.getText().length(); 

         boolean wasAllSelected = (lastDot == 0 && lastMark == length) || (lastDot == length && lastMark == 0); 
         boolean nowNoneSelected = (e.getDot() == 0 && e.getMark() == 0) || (e.getDot() == length && e.getMark() == length); 

         if(wasAllSelected) 
         { 
          // don't try to override again until the next time cell editing is started 
          overrideDeselection = false; 

          // only re-select all if the selection went to none; otherwise the user clicked the cell and dragged to select part of the text 
          if(nowNoneSelected) 
          { 
           tf.selectAll(); 
          } 
         } 
        } 

        lastDot = e.getDot(); 
        lastMark = e.getMark(); 
       } 
      }); 
      listenerInstalled = true; 
     } 

     // Prime the caret listener to override deselection when the first mouseReleased() event is reposted to the editor. 
     overrideDeselection = true; 
     tf.selectAll(); 
     return tf; 
    } 
} 
0

Si votre objectif est de vider la cellule lorsque l'édition commence, inutile d'utiliser selectAll(). Il suffit de définir la valeur sur null.

exemple de mise en œuvre:

(primordial getTableCellEditorComponent() dans DefaultCellEditor)

TableCellEditor myCellEditor = new DefaultCellEditor(new JTextField()){ 
    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, 
       boolean isSelected, int row, int column) 
    { 
     // empty the cell on edit start 
     delegate.setValue((editorComponent instanceof JTextField)? null : value); 
     return editorComponent; 
    } 
}; 
Questions connexes