如何将重点放在JTextField上?

时间:2011-07-17 10:32:55

标签: java swing jtextfield setfocus

我让我的游戏没有鼠标运行,所以使用指针不是一个选择。当玩家输球时,高分菜单会显示。

这是我的代码

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

我试过了

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

但仍然未关注我的JTextField

如何关注它?

10 个答案:

答案 0 :(得分:50)

如果您希望在显示GUI时关注JTextField,可以使用此功能:

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

f JFrameinJTextField。{/ p>

答案 1 :(得分:7)

如果只有一个Top-Level Container,那么GUI构造函数中的最后一行将是例如

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

试试这个,

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

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

答案 4 :(得分:0)

如果页面包含多个项目,并且喜欢设置标签顺序和焦点,我建议使用FocusTraversalPolicy。

如果您使用的是FocusTraversalPolicy,

grabFocus()将无效。

示例代码

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

答案 5 :(得分:0)

在我的情况下上面没有任何工作,直到我调用requestFocus() AFTER 我的构造函数已经返回。

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

MyPanel.initFocus()会有:

myTextField.requestFocus();

它有效。

答案 6 :(得分:0)

此代码鼠标光标“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();
    } 

答案 7 :(得分:0)

尝试使用时,它对我不起作用:

JOptionPane.showConfirmDialog(...)

但是 - 我找到了解决方案! 非常原始,但有效。

通过java.awt跳转到该字段。机器人使用键&#34; Tab&#34;。 例如:

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

如果你应该多按几次&#34; Tab&#34;要获得您的组件,您可以使用以下方法:

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

如果你的Component位置是动态的,你可以无限制地运行while循环,但是在组件上添加一些焦点监听器,一旦到达它就停止循环。

答案 8 :(得分:0)

虽然yourTextField.requestFocus()是一种解决方案,但它不是最好的,因为在官方Java文档中这是不鼓励的,因为方法requestFocus()取决于平台。

文档说:

  

请注意,不鼓励使用此方法,因为其行为取决于平台。相反,我们建议使用requestFocusInWindow()。

改为使用yourJTextField.requestFocusInWindow()

答案 9 :(得分:0)

如何放置jTextField.requestFocusInWindow();进入jTextField FocusLost事件? 为我工作 在JPanel上有5个控件 在单击MessageBox时,很快就失去了对jTextField的关注。 使用了所有建议的代码,但没有运气 只有上述方法适用于我的情况。