Cómo establecer el foco en JTextField?

Hago que mi juego se ejecute sin mouse, por lo que usar el puntero no es una opción. El menú de puntuación más alta se mostrará cuando el jugador pierda.

este es mi código

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

Yo he tratado

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

pero aún no ganó el foco en mi JTextField .

¿Cómo enfocarlo?

Si desea que su JTextField se enfoque cuando aparezca su GUI, puede usar esto:

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

Donde f sería tu JFrame y está tu JTextField .

si hay solo un contenedor de nivel superior, las últimas líneas en el constructor de la GUI serían, por ejemplo,

 . . . 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 } } 

Prueba este,

 myFrame.setVisible(true); EventQueue.invokeLater(new Runnable() { @Override public void run() { myComponent.grabFocus(); myComponent.requestFocus();//or inWindow } }); 

Si la página contiene múltiples elementos y desea establecer la secuencia de tabulación y el enfoque, sugeriré que use FocusTraversalPolicy.

grabFocus () no funcionará si está utilizando FocusTraversalPolicy.

Código de muestra

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

En mi caso, nada de lo anterior funcionó hasta que llamé a requestFocus () DESPUÉS de que mi constructor haya regresado.

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

MyPanel.initFocus () tendría:

 myTextField.requestFocus(); 

Y funciona.

Este código mouse cursor “jtextfield” “Jcombobox” ubicación enfocada

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

No funcionó para mí cuando intenté usar:

 JOptionPane.showConfirmDialog(...) 

Pero, ¡encontré una solución! Muy primitivo, pero funciona.

Solo salta al campo por java.awt. Robot usando la tecla “Tab”. Por ejemplo:

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

Si debe presionar varias veces en “Tab” para obtener su Componente, puede usar el siguiente método:

 GUIUtils.pressTab(3); 

Definición:

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

Si la ubicación de su Componente es dinámica, puede ejecutar el ciclo while sin limitación, pero agregue algún detector de enfoque en el componente, para detener el bucle una vez que haya llegado a él.

Aunque yourTextField.requestFocus() es una solución, no es el mejor ya que en la documentación oficial de Java esto es desalentador ya que el método requestFocus() depende de la plataforma.

La documentación dice:

Tenga en cuenta que se desaconseja el uso de este método porque su comportamiento depende de la plataforma. En su lugar, recomendamos el uso de requestFocusInWindow ().

Utilice yourJTextField.requestFocusInWindow() lugar.