Ich lasse mein Spiel ohne Maus laufen, daher ist die Verwendung des Zeigers keine Wahl. Das High Score-Menü wird angezeigt, wenn der Spieler verloren hat.
das ist mein Code
highScore=new MyTextField("Your Name");
highScore.addKeyListener(this);
highScore.setFont(font);
highScore.requestFocusInWindow();
Ich habe versucht
highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();
aber noch nicht den Fokus auf meine JTextField
gewonnen.
Wie fokussiere ich es?
Wenn Sie möchten, dass Ihre JTextField
bei Anzeige Ihrer GUI fokussiert wird, können Sie Folgendes verwenden:
in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
public void windowOpened( WindowEvent e ){
in.requestFocus();
}
});
Wobei f
Ihre JFrame
wäre und in
Ihre JTextField
ist.
wenn es nur einen Top-Level-Container gibt, wären zum Beispiel die letzten Zeilen im GUI-Konstruktor
.
.
.
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
}
}
In meinem Fall funktionierte nichts, bis ich requestFocus ()AUFGERUFEN HABE, NACHDEMmein Konstruktor zurückgekehrt ist.
MyPanel panel = new MyPanel(...);
frame.add(panel);
panel.initFocus();
MyPanel.initFocus () hätte:
myTextField.requestFocus();
Und es funktioniert.
Probier diese,
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myComponent.grabFocus();
myComponent.requestFocus();//or inWindow
}
});
Dieser Code-Mauscursor "jtextfield" "Jcombobox" wird fokussiert
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();
}
Wenn die Seite mehrere Elemente enthält und die Tabulatorfolge und den Fokus festlegen soll, empfehle ich die Verwendung von FocusTraversalPolicy.
grabFocus () funktioniert nicht, wenn Sie FocusTraversalPolicy verwenden.
Beispielcode
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];
}
});
Bei dem Versuch, es zu verwenden, funktionierte es nicht:
JOptionPane.showConfirmDialog(...)
Aber - Ich habe eine Lösung gefunden! Sehr primitiv, funktioniert aber.
Springen Sie einfach mit Java.awt. Robot mit der Taste "Tab" ..__ zum Feld. Zum Beispiel:
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_TAB);
Wenn Sie mehrmals auf "Tab" drücken, um Ihre Komponente zu erhalten, können Sie die Methode unten verwenden:
GUIUtils.pressTab(3);
Definition:
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());
}
}
});
}
Wenn der Speicherort der Komponente dynamisch ist, können Sie die while-Schleife uneingeschränkt durchlaufen lassen. Fügen Sie jedoch einen Fokus-Listener für die Komponente hinzu, um die Schleife zu stoppen, sobald sie angekommen ist.
Während yourTextField.requestFocus()
eine Lösung ist, ist sie nicht die beste, da dies in der offiziellen Java-Dokumentation nicht empfohlen wird, da die Methode requestFocus()
plattformabhängig ist.
Die Dokumentation sagt:
Beachten Sie, dass von der Verwendung dieser Methode abgeraten wird, da ihr Verhalten plattformabhängig ist. Stattdessen empfehlen wir die Verwendung von requestFocusInWindow ().
Verwenden Sie stattdessen yourJTextField.requestFocusInWindow()
.