Как установить фокус на JTextField? - PullRequest
29 голосов
/ 17 июля 2011

Я запускаю игру без мыши, поэтому использование указателя не является выбором.Меню High Score появится, когда игрок проиграет.

это мой код

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

Я пытался

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

, но все еще не получил фокус на моем JTextField.

Как это сфокусировать?

Ответы [ 9 ]

50 голосов
/ 17 июля 2011

Если вы хотите, чтобы ваш JTextField был сфокусирован при отображении вашего графического интерфейса, вы можете использовать это:

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

Где f будет вашим JFrame, а in - вашим JTextField.

7 голосов
/ 17 июля 2011

, если есть только один Контейнер верхнего уровня , тогда последними строками в конструкторе GUI будут, например,

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

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
5 голосов
/ 17 ноября 2013
public void actionPerformed(ActionEvent arg0)
{
    if (arg0.getSource()==clearButton)
    {
        enterText.setText(null);
        enterText.grabFocus();  //Places flashing cursor on text box        
    }       
}
0 голосов
/ 20 мая 2018

Хотя yourTextField.requestFocus() - это решение, оно не является лучшим, поскольку в официальной документации Java это не рекомендуется, поскольку метод requestFocus() зависит от платформы.

Документация гласит:

Обратите внимание, что использование этого метода не рекомендуется, поскольку его поведение зависит от платформы. Вместо этого мы рекомендуем использовать requestFocusInWindow ().

Вместо этого используйте yourJTextField.requestFocusInWindow().

0 голосов
/ 16 мая 2018

У меня не получалось, когда пытался использовать:

JOptionPane.showConfirmDialog(...)

Но - Я нашел решение! Очень примитивно, но работает.

Просто прыгайте на поле с помощью java.awt. Робот с помощью клавиши «Tab». Например:

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

Если вам нужно нажать несколько раз на «Tab», чтобы получить ваш компонент, вы можете использовать следующий метод:

GUIUtils.pressTab(3);

Определение:

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());
            }
        }
    });
}

Если местоположение вашего компонента является динамическим, вы можете без ограничений запустить цикл while, но добавьте слушателя фокуса на компонент, чтобы остановить цикл после его прибытия.

0 голосов
/ 02 мая 2017

Этот код курсора мыши «jtextfield» «Jcombobox» расположен в фокусе

 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 голосов
/ 16 февраля 2016

В моем случае ничто из вышеперечисленного не работало, пока я не вызвал requestFocus () ПОСЛЕ мой конструктор вернулся.

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

MyPanel.initFocus () будет иметь:

myTextField.requestFocus();

И это работает.

0 голосов
/ 19 июля 2015

Если страница содержит несколько элементов и ей нравится устанавливать последовательность вкладок и фокус, я предлагаю использовать FocusTraversalPolicy.

grabFocus () не будет работать, если вы используете FocusTraversalPolicy.

Примеркод

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 голосов
/ 27 мая 2015

Попробуйте это,

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

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