web-dev-qa-db-fra.com

Comment définir le focus sur JTextField?

Je fais fonctionner mon jeu sans souris, alors utiliser un pointeur n'est pas un choix. Le menu Score élevé apparaîtra lorsque le joueur perdra.

c'est mon code

    highScore=new MyTextField("Your Name");
    highScore.addKeyListener(this);
    highScore.setFont(font);
    highScore.requestFocusInWindow();

J'ai essayé 

highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();

mais toujours pas se concentrer sur ma JTextField.

Comment se concentrer?

29
Kenjiro

Si vous souhaitez que votre JTextField soit ciblée lorsque votre interface graphique s'affiche, vous pouvez utiliser ceci:

in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
    public void windowOpened( WindowEvent e ){
        in.requestFocus();
    }
}); 

f serait votre JFrame et in serait votre JTextField.

47
Lukas Knuth

si y a-t-il un seul conteneur de niveau supérieur alors les dernières lignes du constructeur de l'interface graphique seraient par exemple

.
.
.
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
7
mKorbel
public void actionPerformed(ActionEvent arg0)
{
    if (arg0.getSource()==clearButton)
    {
        enterText.setText(null);
        enterText.grabFocus();  //Places flashing cursor on text box        
    }       
}
5
kprice789

Dans mon cas, rien de ce qui précède n’a fonctionné jusqu’à ce que j’ai appelé requestFocus ()APRÈS LE RETOUR DEmon constructeur.

MyPanel panel = new MyPanel(...);
frame.add(panel);
panel.initFocus();

MyPanel.initFocus () aurait:

myTextField.requestFocus();

Et il fonctionne.

0
Peter Quiring

Essaye celui-là, 

myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
0
Dulkith Bataduwa

Ce curseur de souris de code «jtextfield» «Jcombobox» est centré 

 try {
     Robot  robot = new Robot();
        int x = Jtextfield.getLocationOnScreen().x;
        int y=  Jtextfield.getLocationOnScreen().y;
       JOptionPane.showMessageDialog(null, x+"x< - y>"+y);// for I location see
        robot.mouseMove(x, y);
    } catch (AWTException ex) { 
        ex.printStackTrace();
    } 
0
Habib Göker

Si la page contient plusieurs éléments et souhaite définir la séquence de tabulation et le focus, nous vous suggérons d'utiliser FocusTraversalPolicy.

grabFocus () ne fonctionnera pas si vous utilisez FocusTraversalPolicy.

Exemple de code

int focusNumber = 0;
Component[] focusList;
focusList = new Component[] { game, move, amount, saveButton,
            printButton, editButton, deleteButton, newButton,
            settingsButton };

frame.setFocusTraversalPolicy(new FocusTraversalPolicy() {

        @Override
        public Component getLastComponent(Container aContainer) {
            return focusList[focusList.length - 1];
        }

        @Override
        public Component getFirstComponent(Container aContainer) {
            return focusList[0];
        }

        @Override
        public Component getDefaultComponent(Container aContainer) {
            return focusList[1];
        }

        @Override
        public Component getComponentAfter(Container focusCycleRoot,
                Component aComponent) {
            focusNumber = (focusNumber + 1) % focusList.length;
            if (focusList[focusNumber].isEnabled() == false) {
                getComponentAfter(focusCycleRoot, focusList[focusNumber]);
            }
            return focusList[focusNumber];
        }

        @Override
        public Component getComponentBefore(Container focusCycleRoot,
                Component aComponent) {
            focusNumber = (focusList.length + focusNumber - 1)
                    % focusList.length;
            if (focusList[focusNumber].isEnabled() == false) {
                getComponentBefore(focusCycleRoot, focusList[focusNumber]);
            }
            return focusList[focusNumber];
        }
    });
0
MukeshKoshyM

Cela ne fonctionnait pas pour moi quand j'ai essayé d'utiliser:

JOptionPane.showConfirmDialog(...)

Mais - j'ai trouvé une solution! Très primitif, mais fonctionne.

Il suffit de passer au champ Java.awt. Robot en utilisant la touche "Tab" . Par exemple:

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_TAB);

Si vous devez appuyer plusieurs fois sur "Tab" pour obtenir votre composant, vous pouvez utiliser la méthode ci-dessous:

GUIUtils.pressTab(3);

Définition:

public static void pressTab(int amountOfClickes)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            try
            {
                Robot robot = new Robot();
                int i = amountOfClickes;
                while (i-- > 0)
                {
                    robot.keyPress(KeyEvent.VK_TAB);
                    robot.delay(100);
                    robot.keyRelease(KeyEvent.VK_TAB);
                }
            }
            catch (AWTException e)
            {
                System.out.println("Failed to use Robot, got exception: " + e.getMessage());
            }
        }
    });
}

Si l'emplacement de votre composant est dynamique, vous pouvez parcourir la boucle while sans limitation, mais ajouter un écouteur de focus sur le composant, pour arrêter la boucle une fois qu'elle est arrivée.

0
Adir

Bien que yourTextField.requestFocus() soit une solution, ce n’est pas la meilleure solution car cela est décourageant dans la documentation Java officielle, car la méthode requestFocus() dépend de la plate-forme.

La documentation dit:

Notez que l'utilisation de cette méthode est déconseillée car son comportement dépend de la plate-forme. Au lieu de cela, nous recommandons l'utilisation de requestFocusInWindow ().

Utilisez yourJTextField.requestFocusInWindow() à la place.

0