Как установить фокус на JTextField?

Я заставляю свою игру работать без мыши, поэтому использование указателя не является выбором. Меню 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 ответов


если вы хотите JTextField чтобы быть сосредоточенным, когда ваш GUI появляется, Вы можете использовать это:

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

здесь f будет твой JFrame и in ваш JTextField.


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

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

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

public void actionPerformed(ActionEvent arg0)
{
    if (arg0.getSource()==clearButton)
    {
        enterText.setText(null);
        enterText.grabFocus();  //Places flashing cursor on text box        
    }       
}

это

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

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

Если страница содержит несколько элементов и хочет установить последовательность вкладок и фокус, я предложу использовать 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];
        }
    });

в моем случае ничего выше не работало, пока я не вызвал requestFocus ()после Мой конструктор вернулся.

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

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

myTextField.requestFocus();

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


этот код курсора мыши "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();
    } 

Он не работал для меня, когда пытался использовать:

JOptionPane.showConfirmDialog(...)

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

просто перейти к полю на java.ОУ.робот С помощью клавиши "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 без ограничений, но добавьте некоторый слушатель фокуса на компоненте, чтобы остановить цикл, как только он прибыл к нему.


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

в документации сказано, что:

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

использовать yourJTextField.requestFocusInWindow() вместо.