Как установить фокус на 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()
вместо.