2010-10-29 4 views
3

Les cellules JTable par défaut sont en mode ajout lorsque la cellule est double-cliquée. Existe-t-il un moyen de faire passer la cellule en mode d'écrasement à la place, IOW, sélectionnez le contenu de la cellule de sorte que si l'utilisateur commençait à taper l'ancien texte serait remplacé par le nouveau texte sans avoir à l'effacer manuellement?Comment rendre les cellules JTable par défaut en mode écrasement

Répondre

4

Vous devriez être en mesure de le faire en créant le vôtre TableCellEditor, qui peut être assigné à la table parent en utilisant setCellEditor(). Cet objet est une fabrique appelée par JTable à chaque fois que l'utilisateur commence à modifier une cellule pour créer le champ utilisé pour l'édition proprement dite. Vous pouvez retourner votre propre JTextField, et évitez simplement de définir l'ancienne valeur pour obtenir ce que vous demandez. Vous devrez également attacher un écouteur au champ de texte pour mettre à jour la valeur dans la table lorsque l'utilisateur a fini de taper.

+0

En utilisant cette approche, vous devrez peut-être créer un éditeur personnalisé pour chaque type de données. Un pour String, Integer etc. – camickr

3

Vous pourriez trouver le Table Select All Editor utile.

+0

J'ai jeté un oeil à RXTable pour voir si je pouvais comprendre, mais c'est dur puisque je travaille avec un swing.JTable() généré par NetBeans. En outre, j'ajoute et enlève des rangées de la table basées sur l'entrée d'utilisateur. Existe-t-il un moyen d'ajouter un écouteur qui fera simplement tout sélectionner sur un simple clic (ou navigation TAB) à la cellule, lorsque la cellule reçoit le focus? Je voudrais que ce NetBeans JTable se comporte comme un tableau Excel, car beaucoup sont à l'aise avec cette interface utilisateur. – jacknad

+0

Au cas où cela aiderait quelqu'un d'autre, le code clé de RXTable (la méthode editCellAt()) était très facile à extraire et à adapter dans une autre sous-classe de table personnalisée. –

2

J'ai implémenté la méthode suivante [addDeletePreviousOnEditBehavior] qui fonctionne bien! Notez que vous devez utiliser TableCellEditor. Pour cela, ajoutez le code suivant:

JTable table=new JTable(); 
JTextField field=new JTextField(); 
addDeletePreviousOnEditBehavior(field); 
table.setCellEditor(new DefaultCellEditor(field)); 

La méthode est:

public static void addDeletePreviousOnEditBehavior(final JComponent field) { 

    field.addFocusListener(new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent fe) { 
      field.putClientProperty(DELETE_ON_EDIT, true); 
     } 

     @Override 
     public void focusLost(FocusEvent fe) { 
     } 
    }); 

    field.addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent ke) { 
     } 

     @Override 
     public void keyPressed(KeyEvent ke) { 
      if ((!(ke.isActionKey() 
        || isSpecial(ke.getKeyCode()))) 
        && ((Boolean) field.getClientProperty(DELETE_ON_EDIT))) { 
       System.out.println("Key:" + ke.getKeyCode() + "/" + ke.getKeyChar()); 
       field.putClientProperty(DELETE_ON_EDIT, false); 
       if (field instanceof JFormattedTextField) { 
        ((JFormattedTextField) field).setValue(null); 
       } 
       if (field instanceof JTextComponent) { 
        ((JTextComponent) field).setText(null); 
       } 

      } 
     } 

     @Override 
     public void keyReleased(KeyEvent ke) { 
      // do nothing 
     } 
    }); 
} 
Questions connexes