2011-04-26 4 views
1

J'ai un JPanel qui utilise un FlowLayout et contient beaucoup de JButtons. Les boutons sont dans une grille bidimensionnelle (par le FlowLayout). Le JPanel peut être redimensionné, et, bien sûr, quand il est, l'emplacement des boutons dans la grille change (bien que l'ordre, bien sûr, reste le même). Je souhaite que l'utilisateur puisse naviguer d'un bouton à un autre dans la grille en utilisant les touches fléchées du clavier.Détermination des voisins immédiats d'un JComponent dans un FlowLayout

Y a-t-il un moyen de dire pour un bouton donné, quel bouton est actuellement directement au-dessus, quel bouton est directement en dessous et quels boutons sont à sa gauche et à droite?

Évidemment, ce serait trivial si j'utilisais un GridLayout, mais j'ai besoin d'utiliser un FlowLayout pour d'autres raisons.

Répondre

2

La gauche et les touches flèche droite ne sont pas un problème. Comme mentionné par jzd vous ajoutez juste les KeyStrokes à l'ensemble des clés de traversée.

Pour les touches haut/bas, vous devez créer une action personnalisée. Vous pouvez utiliser l'emplacement du composant actuel. Ensuite, pour monter, vous pouvez changer le Y coordonné par disons 10 pixels (5 pixels pour l'écart de ligne entre les composants plus 5 supplémentaires). Ensuite, vous pouvez utiliser le:

Container.getComponentAt(Point p) 

pour trouver le composant à ce nouvel emplacement.

Pour descendre, vous devez commencer par l'emplacement du bouton, puis ajouter sur la hauteur du bouton plus 10 pixels.

Bien sûr, vous utiliseriez alors les liaisons de touches pour lier la touche KeyStroke haut/bas à l'action.

Remarque: Je ne suis pas sûr si vous devez ajouter les 5 pixels supplémentaires pour trouver les composants au-dessus ou au-dessous du composant. Vous pouvez juste être en mesure d'utiliser l'écart vertical. Je ne suis pas sûr comment la vérification des limites fonctionne sur la méthode getComponentAt().

1

Je pense que vous pouvez simplement utiliser la mise en œuvre de mise au point de mise en place qui est en place comme onglet ou shift navigue les boutons sélectionnés dans un FlowLayout correctement.

Je pense que vous avez juste besoin d'ajouter les touches fléchées pour des ensembles comme le forwardDefaultFocusTraversalKeys

Plus d'infos:

http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html