web-dev-qa-db-fra.com

Définition du focus sur un champ de texte

J'ai une application développée dans les netbeans et je veux définir le focus sur un certain jTextField lorsqu'un panneau est affiché. J'ai lu un certain nombre de messages et j'ai essayé diverses méthodes mais je n'ai pas fonctionné. L'un des principaux problèmes est de savoir où placer le code requis, qui, selon moi, est this.txtMessage.requestFocusInWindow();

Il y a quelques articles qui indiquent l'utilisation d'un écouteur de fenêtre, mais comme les netbeans ont généré l'interface graphique, je ne vois pas comment implémenter les interfaces car je ne peux pas éditer le code qui crée le jPANEL etc. Le tout est très frustrant et je ne le fais vraiment pas crois que cela devrait être si difficile.

Tout comme un test, j'ai ajouté la fonction requestFocusInWindow(); à un bouton du panneau et elle a mis le focus sur l'entrée souhaitée.

14
Lee

J'ai eu un scénario similaire où j'avais besoin de mettre l'accent sur une zone de texte dans un panneau lorsque le panneau était affiché. Le panneau a été chargé au démarrage de l'application, je n'ai donc pas pu définir le focus dans le constructeur. Comme le panneau n'était pas chargé ou n'était pas focalisé sur le spectacle, cela signifiait que je n'avais aucun événement pour déclencher la demande de focus.

Pour résoudre ce problème, j'ai ajouté une méthode globale à ma principale qui appelait une méthode dans le panneau qui invoquait requestFocusInWindow() dans la zone de texte. J'ai mis l'appel à la méthode globale dans le bouton qui montrait le panneau, après l'appel à afficher. Cela signifiait que le panneau serait affiché, puis la zone de texte affectée au focus après avoir montré le panneau. J'espère que cela a du sens et aide!

En outre, vous pouvez modifier la plupart du code généré automatiquement en cliquant avec le bouton droit sur l'objet en mode Création et en sélectionnant un code personnalisé, mais je ne pense pas que cela vous permette de modifier les panneaux.

17
chvck

Je ne sais pas si je manque quelque chose ici, mais il n'y a aucune raison pour laquelle vous ne pouvez pas ajouter d'auditeur à votre panneau.

Dans Netbeans, appuyez simplement sur le bouton "Source" en haut à gauche de la fenêtre de l'éditeur et vous pouvez modifier la plupart du code. Le code de mise en page réel est généralement verrouillé, mais vous pouvez même le personnaliser si vous en avez besoin.

Pour autant que je sache, txtMessage.requestFocusInWindow() est censé configurer le focus par défaut lorsque la fenêtre s'affiche la première fois. Si vous souhaitez demander le focus après que la fenêtre a déjà été affichée, vous devez utiliser txtMessage.requestFocus()

Pour les tests, vous pouvez simplement ajouter un écouteur dans le constructeur:

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    txtMessage.requestFocus();
  } 
}); 
11
Riaan Cornelius

Dans un JFrame ou JDialog, vous pouvez toujours écraser la méthode setVisible (), cela fonctionne bien. Je n'ai pas essayé dans un JPanel, mais peut être une alternative.

@Override
public void setVisible(boolean value) {
    super.setVisible(value);
    control.requestFocusInWindow();
}
5
Igor Rodriguez

J'ai joué avec ça pour toujours et j'ai finalement trouvé quelque chose qui semble toujours fonctionner!

    textField = new JTextField() {

        public void addNotify() {
            super.addNotify();
            requestFocus();
        }
    };
2

Je l'ai fait en définissant un événement AncesterAdded sur le textField et le focus demandeur dans la fenêtre.

2
Ray Saunders

Pour moi, le moyen le plus simple de le faire fonctionner est de mettre la ligne component.requestFocus();, après la ligne setVisible(true);, en bas de votre constructeur de cadre ou de panneau.

Cela a probablement quelque chose à voir avec la demande de focus, une fois que tous les composants ont été créés, car la création d'un nouveau composant, après avoir demandé la requête de focus, rendra votre composant lâche et se concentrera sur votre composant nouvellement créé. . Du moins, c'est ce que je suppose.

1
SuperRetro

Si vous créez votre GUI avec Netbeans, vous pouvez également insérer du code auto-écrit. Sélectionnez simplement un élément (peut-être le bouton, le panneau ou la fenêtre) et utilisez l'onglet "Code" dans le dialogue "Propriétés".

Vous pouvez y insérer Pré - et Post - code pour diverses parties de le processus de création.

Je pense que le champ "After-All-Set-Code" de la fenêtre est un bon endroit pour votre code, ou vous pouvez le lier à l'événement ("Properties" -dialog -> "Events") "componentShown "du champ/panneau de texte.

1

Rien de ce qui précède n'a fonctionné pour moi, car ma fenêtre est un JPopupMenu.

Ce qui a fonctionné était le suivant:

addAncestorListener(new AncestorListener() {
    @Override
    public void ancestorAdded(AncestorEvent ae) {
        myEdit.requestFocus();
    }

    // ... other ancestor listener methods
}
1
wakjah