2010-01-27 14 views
4

Je vais avoir un JTable contenant les éditeurs JComboBox initialisés un peu commeJTable avec l'éditeur JComboBox: Est-il possible de modifier la valeur de la cellule du clavier avec une seule touche

JComboBox comboBox = ...; 
TableColumn tc = table.getColumnModel().getColumn(i); 
tc.setCellEditor(new DefaultCellEditor(comboBox)); 

Cela fonctionne bien autrement mais je aime pouvoir naviguer dans la table et mettre à jour les valeurs avec le clavier seulement. Maintenant c'est possible avec les combos, mais si je veux mettre à jour la valeur "1", je dois d'abord appuyer sur une touche pour activer la combo, puis appuyer sur "1" pour sélectionner l'élément. Donc, ce que je veux, c'est que je pourrais appuyer sur "1" et l'élément serait sélectionné avec une seule pression sur une touche.

Pour les cellules de texte que j'ai réussi à le faire avec prepareEditor comme 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; 
} 

... mais je ne l'ai pas réussi à comprendre ce qu'il faut faire avec la zone de liste déroulante.

Une possibilité pourrait être propre TableCellEditor mais s'il y a une solution plus simple qui serait bien =)

br, Touko

+1

Vous pouvez toujours attraper vous-même les touches avec un KeyListener. Ou est votre question plus comment donnez-vous le focus approprié JComboBox une fois que vous savez quelle touche a été pressée. – Pace

+0

Ou peut-être remplacer JTable # processKeyBinding ou JTable # processKeyEvent .. Je dois encore voir s'il y a une solution plus simple =) – Touko

+0

Je sais que c'est une vieille question, mais je veux savoir comment les gens ont réussi à y parvenir. – Andree

Répondre

0

Vous devez ajouter un KeyListener à votre code.

La meilleure solution est d'ajouter au composant JTable où vous placerez le JComboBox et mettre en œuvre la méthode keyPressed(KeyEvent e) ou un keyReleased(KeyEvent e) afin de savoir qui est la clé et faire le nécessaire.

Ici je vous donne un exemple:

JTable table = new JTable(); 

// Your necessary code (create combo box, cell editor...etc) 

table.addKeyListener(new KeyListener() { 

    public void keyTyped(KeyEvent e) { 
    } 

    public void keyReleased(KeyEvent e) { 
    } 

    public void keyPressed(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     switch(keyCode) { 
     case KeyEvent.VK_1: 
      // manage key 1 
      break; 
     case KeyEvent.VK_A: 
      // manage key A 
      break; 
     case KeyEvent.VK_F1: 
      // manage key F1 
      break; 
     case KeyEvent.VK_TAB: 
      // manage key TAB 
      break; 
     default: 
      // manage other keys 
     } 
    } 
}); 

Vous pouvez également combiner cette solution avec un dictionnaire qui concerne le code d'activation avec une interface d'action.

Cette deuxième solution a besoin le code suivant: Un attribut global (le dictionnaire):

Map<Integer,MyAction> keyActions = new Hashmap<Integer,MyAction>(); 

A propre interface d'action:

public interface MyAction { 

    public void doAction(); 
} 

Et la fonction KeyListener.keyPressed() serait ce qui suit:

public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    MyAction ma = keyActions.get(keyCode); 
    if (ma != null) { 
     ma.doAction(); 
    } 
    else { 
     // do default action for other keys 
    } 
} 

J'espère que cela vous aide.

Cordialement!

2

Au cas où quelqu'un est toujours intéressé, je fais une simple modification au code de Touko et cela fonctionne pour moi:

public class CustomTable extends JTable { 
    private static final long serialVersionUID = -8855616864660280561L; 

    public CustomTable(TableModel tableModel) { 
     super(tableModel); 
    } 

    @Override 
    public Component prepareEditor(TableCellEditor editor, int row, int column) { 
     final Component comp = super.prepareEditor(editor, row, column); 

     // Text component should select all text when initiated for editing. 
     if (comp instanceof JTextComponent) 
      ((JTextComponent) comp).selectAll(); 

     // Try to obtain focus for the editor component. 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { comp.requestFocusInWindow(); } 
     }); 

     return comp; 
    } 
} 

Donc, fondamentalement, je suis juste demander mise au point pour le composant éditeur à un moment plus tard à l'aide SwingUtilities.invokeLater. La raison de cette approche est que la demande de focus échouera si le composant de l'éditeur n'est pas encore visible.

Espérons que cela peut aider n'importe qui.