Composante réglage de focus dans JOptionPane.showOptionDialog()
Afin d'avoir personnalisé les légendes de bouton dans une boîte de dialogue de saisie, j'ai créé le code suivant:
String key = null;
JTextField txtKey = new JTextField();
int answerKey = JOptionPane.showOptionDialog(this, new Object[] {pleaseEnterTheKey, txtKey}, decryptionKey, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] {okCaption, cancelCaption}, okCaption);
if (answerKey == JOptionPane.OK_OPTION && txtKey.getText() != null) {
key = txtKey.getText();
}
Comment puis-je déplacer le focus (curseur) pour le champ de texte de la boîte de dialogue est affichée?
Mise à JOUR
Cela ne fonctionne pas pour moi, je veux dire le textfield a pas d'accent:
OS: Fedora Gnome
public class Test {
public static void main(String[] args) {
String key = null;
JTextField txtKey = new JTextField();
txtKey.addAncestorListener(new RequestFocusListener());
int answerKey = JOptionPane.showOptionDialog(null, new Object[]{"Please enter the key:", txtKey}, "Title", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[]{"OKKK", "CANCELLLL"}, "OKKK");
if (answerKey == JOptionPane.OK_OPTION && txtKey.getText() != null) {
key = txtKey.getText();
}
}
}
et quelle est la question?
Comment puis-je déplacer le curseur vers le champ de texte?
essayez
Cela ne semble pas fonctionner dans mes tests simples. Je suis sûr que j'ai vu le "on-line" réponse à cela, mais pour la vie de moi je ne me souviens pas d'elle.
Il ne fonctionne pas! 🙁
Comment puis-je déplacer le curseur vers le champ de texte?
essayez
txtKey.requestFocusInWindow();
- download.oracle.com/javase/6/docs/api/java/awt/...Cela ne semble pas fonctionner dans mes tests simples. Je suis sûr que j'ai vu le "on-line" réponse à cela, mais pour la vie de moi je ne me souviens pas d'elle.
Il ne fonctionne pas! 🙁
OriginalL'auteur ehsun7b | 2011-06-06
Vous devez vous connecter pour publier un commentaire.
Dialogue Focus montre comment vous pouvez facilement définir le focus sur un composant dans une boîte de dialogue modale.
Fonctionne très bien pour mon utilisation JDK6_7 sur XP. Publier vos SSCCE (sscce.org) qui démontre votre problème. Le code que vous avez posté n'est pas un SSCCE puisque nous ne savons pas ce que la valeur de tous vos varialbes est et il ne se compile pas et il n'y a pas de méthode main ().
Vérifier ma question de mise à jour s'il vous plaît.
Votre posté code fonctionne pour moi peut-être leur est une différence dans le traitement des événements entre les deux systèmes. Avez-vous d'ajouter une sortie vers assurez-vous que l'écouteur d'événement est invoqué? Si vous lisez le blog, quelqu'un a suggéré qu'une HierarchyListener peut également être utilisé. Essayez, pour voir ce qui se passe. Ou une autre option consiste à encapsuler le code de la AncestorListener dans un SwingUtltities.invokeLater(). Cela va ajouter le code à la fin de l'EDT de sorte que, je l'espère, s'exécute après l'accent a été mis sur la touche.
OriginalL'auteur camickr
OriginalL'auteur Frank M.
passant null comme le dernier argument est la solution. Au moins, il a travaillé pour moi.
Mais même cette solution apporter un autre problème:
Porté composant et par Défaut composant sont différents. Par défaut le composant ou le bouton par défaut est la touche qui son onclick feux si vous appuyez sur
ENTER KEY
.Le dernier argument de définir le composant par défaut qui obtient le focus trop et en passant null apporte le problème de ne pas avoir de défaut de composant!Je l'ai résolu mon code de cette façon, mais je suppose que ce n'est pas une bonne pratique:
OriginalL'auteur ehsun7b
J'ai eu le même problème avec le RequestFocusListener() ne fonctionne pas sur Linux, après à la suite de la discussion sur http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5018574 j'ai trouvé que l'ajout d'un invokeLater fixe pour l'instant...
oui cela s'applique à cette solution trop
OriginalL'auteur Jim Morris
L'astuce consiste à (a) l'utilisation d'un AncestorListener sur le composant de texte à la demande de l'accent, et lorsque le focus est perdu (donné sur le bouton par défaut), demande de la concentration pour une deuxième fois à l'aide d'un FocusListener sur le composant de texte (mais ne pas demander de mettre l'accent, après que):
OriginalL'auteur Udo Schuermann
Essayer cette
la deuxième solution est appropriée pour vous. à l'égard de l'extrait de code j'ai compris, il suffit d'inclure
txtKey
comme un élément de l'options
, et ensuite dans l'argument finaloptions[indexOfTextField]
. Je l'ai testé et il fonctionne très bien.Le componentShown n'exécutez jamais!
il devrait, sinon vous ne verriez pas
txtKey
à l'écran. de toute façon, je vous recommande d'aller avec la deuxième option, je vous avais présenté. il a été testé et vérifié.J'ai essayé la deuxième solution, le problème avec ça, c'est: Il montre le textfield en plus des boutons, pas dans le milieu de la boîte de dialogue. 🙂
OriginalL'auteur mre
Meilleure manière de le faire: créer le JOptionPane en utilisant le constructeur, remplacer selectInitialValue pour définir le focus, puis construire la boîte de dialogue à l'aide de createDialog.
OriginalL'auteur ceklock
J'ai trouvé une solution !
Très primitif, mais qui fonctionne.
Juste sauter sur le terrain par java.awt.Robot aide de la touche "Tab".
Par exemple:
Si vous appuyez sur plusieurs fois sur "Tab" pour obtenir votre Composant, vous pouvez utiliser la méthode ci-dessous:
Définition:
Si votre emplacement est dynamique, vous pouvez exécuter sur la boucle while sans limitation, mais ajouter un peu de l'accent d'écoute sur le composant, pour arrêter la boucle, une fois arrivé à elle.
OriginalL'auteur Adir