Question

Je suis en train d'ajouter une colonne à un JTable avec le comportement suivant (similaire à Windows Explorer et coquilles similaires):

  • La cellule peut être cliqué une fois pour le sélectionner, comme d'habitude.
  • La cellule peut être un double-clic pour effectuer une action distincte (le lancement d'un programme externe.)
  • La valeur de la cellule (une chaîne) peut encore être modifiée, par simple clic sur un deuxième temps (après une pause) ou en appuyant sur F2 lorsque la cellule est mise en surbrillance.

Un double-clic doit pas édition de déclenchement de la cellule, mais je voudrais laisser toute autre modification par défaut déclenche de fonctionnement si possible.

Je l'ai essayé d'ajouter un MouseListener à la table, et consommer tous MouseEvents, mais cela ne fonctionne pas - si je reviens true de isCellEditable() alors mon auditeur ne reçoit jamais les événements de clic, mais si je retourne false puis F2 ne fonctionne plus.

Peut-il être réalisé en utilisant uniquement des écouteurs d'événement? Je préférerais ne pas salir avec les fonctions plaf si je peux l'éviter.

Était-ce utile?

La solution

Vous devrez faire votre propre cellEditor et ovveride

public boolean isCellEditable( EventObject e )

Vous pouvez établir une distinction entre un simple clic et double avec la clickCount sur le eventObject

Si son un seul clic et son sur une cellule sélectionnée, vous pouvez retourner true retourner false sinon;

récupérer ligne et colonne avec

int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());

pour permettre F2, vous pouvez ajouter des instructions InputMap en ActionMap entrées

similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

et de votre action, vous pouvez alors tirer vous-même cellediting

table.editCellAt(row, column );

Autres conseils

Le DefaultCellEditor a une méthode setClickCountToStart () pour contrôler les clics de souris pour l'édition. La valeur par défaut est 2. Modifier cette valeur n'a aucun effet sur la fonctionnalité F2.

Par conséquent, vous pouvez définir l'édition d'un triple clic.

Je ne sais pas exactement comment gérer deux clics simples pour commencer à modifier, mais je suppose que vous utilisez une minuterie pour garder la trace du premier clic, puis faire le montage si le deuxième simple clic est en vous intervalle de temps.

J'ai résolu ce problème en enveloppant le CellEditor existant avec Proxy et d'intercepter les appels à isCellEditable, soit faux pour tous les événements de souris et de déléguer tous les autres appels à la CellEditor originale.

Ceci est un peu plus complexe que la solution de camickr mais fonctionne pour tous les éditeurs (j'ai 4 en tout.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top