web-dev-qa-db-de.com

Wie kann ich den Fokus auf JTextField setzen?

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?

29
Kenjiro

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.

47
Lukas Knuth

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
     }
});
7
mKorbel
public void actionPerformed(ActionEvent arg0)
{
    if (arg0.getSource()==clearButton)
    {
        enterText.setText(null);
        enterText.grabFocus();  //Places flashing cursor on text box        
    }       
}
5
kprice789

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.

0
Peter Quiring

Probier diese, 

myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
0

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();
    } 
0
Habib Göker

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

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.

0
Adir

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().

0