我让我的游戏没有鼠标运行,所以使用指针不是一个选择。当玩家输球时,高分菜单会显示。
这是我的代码
highScore=new MyTextField("Your Name");
highScore.addKeyListener(this);
highScore.setFont(font);
highScore.requestFocusInWindow();
我试过了
highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();
但仍然未关注我的JTextField
。
如何关注它?
答案 0 :(得分:50)
如果您希望在显示GUI时关注JTextField
,可以使用此功能:
in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
public void windowOpened( WindowEvent e ){
in.requestFocus();
}
});
f
JFrame
和in
是JTextField
。{/ 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的关注。 使用了所有建议的代码,但没有运气 只有上述方法适用于我的情况。