Je fais fonctionner mon jeu sans souris, alors utiliser un pointeur n'est pas un choix. Le menu Score élevé apparaîtra lorsque le joueur perdra.
c'est mon code
highScore=new MyTextField("Your Name");
highScore.addKeyListener(this);
highScore.setFont(font);
highScore.requestFocusInWindow();
J'ai essayé
highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();
mais toujours pas se concentrer sur ma JTextField
.
Comment se concentrer?
Si vous souhaitez que votre JTextField
soit ciblée lorsque votre interface graphique s'affiche, vous pouvez utiliser ceci:
in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
public void windowOpened( WindowEvent e ){
in.requestFocus();
}
});
Où f
serait votre JFrame
et in
serait votre JTextField
.
si y a-t-il un seul conteneur de niveau supérieur alors les dernières lignes du constructeur de l'interface graphique seraient par exemple
.
.
.
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
}
}
Dans mon cas, rien de ce qui précède n’a fonctionné jusqu’à ce que j’ai appelé requestFocus ()APRÈS LE RETOUR DEmon constructeur.
MyPanel panel = new MyPanel(...);
frame.add(panel);
panel.initFocus();
MyPanel.initFocus () aurait:
myTextField.requestFocus();
Et il fonctionne.
Essaye celui-là,
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myComponent.grabFocus();
myComponent.requestFocus();//or inWindow
}
});
Ce curseur de souris de code «jtextfield» «Jcombobox» est centré
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();
}
Si la page contient plusieurs éléments et souhaite définir la séquence de tabulation et le focus, nous vous suggérons d'utiliser FocusTraversalPolicy.
grabFocus () ne fonctionnera pas si vous utilisez FocusTraversalPolicy.
Exemple de code
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];
}
});
Cela ne fonctionnait pas pour moi quand j'ai essayé d'utiliser:
JOptionPane.showConfirmDialog(...)
Mais - j'ai trouvé une solution! Très primitif, mais fonctionne.
Il suffit de passer au champ Java.awt. Robot en utilisant la touche "Tab" . Par exemple:
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_TAB);
Si vous devez appuyer plusieurs fois sur "Tab" pour obtenir votre composant, vous pouvez utiliser la méthode ci-dessous:
GUIUtils.pressTab(3);
Définition:
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 l'emplacement de votre composant est dynamique, vous pouvez parcourir la boucle while sans limitation, mais ajouter un écouteur de focus sur le composant, pour arrêter la boucle une fois qu'elle est arrivée.
Bien que yourTextField.requestFocus()
soit une solution, ce n’est pas la meilleure solution car cela est décourageant dans la documentation Java officielle, car la méthode requestFocus()
dépend de la plate-forme.
La documentation dit:
Notez que l'utilisation de cette méthode est déconseillée car son comportement dépend de la plate-forme. Au lieu de cela, nous recommandons l'utilisation de requestFocusInWindow ().
Utilisez yourJTextField.requestFocusInWindow()
à la place.