2009-09-15 15 views
32

Ich habe ein Formular mit Swing in Java erstellt. In der Form habe ich ein Textfeld verwendet, auf dem ich den Fokus einstellen muss, wenn ich die Taste drücke.Wie setzt man den Fokus auf eine bestimmte Komponente in Java?Wie legen Sie einen Fokus auf Textfield in Swing?

+1

10 Fragen, von denen keine Antworten akzeptiert ... –

Antwort

73

Würde Component.requestFocus() Ihnen geben, was Sie brauchen?

+0

Danke, lass mich sehen, ob es für mich funktioniert oder nicht –

+8

Nahm mich fünf Minuten, um es zu finden ... so viel für "einfache" Suche :-(- Ah ja, die Java-API-Dokumente sind kein Vorbild der Klarheit sowieso :-) – Joey

+3

FYI, die [Javadocs für JComponent] (http://docs.oracle.com/javase/7/docs/api/index.html) sagen von 'requestFocus()', "Gebrauch von diesem Methode wird abgeraten, weil das Verhalten plattformabhängig ist Wir empfehlen die Verwendung von [requestFocusInWindow()] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocusInWindow()). Weitere Informationen zum Fokus finden Sie unter [Verwenden des Fokus-Subsystems] (http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html), einem Abschnitt im Java-Lernprogramm . " –

13

Nun, da wir die API durchsucht haben, müssen wir nur noch die API lesen.

Nach der API-Dokumentation:

"Weil der Fokus Verhalten dieser Methode ist plattformabhängig sind Entwickler stark gefördert Verwendung requestFocusInWindow wenn möglich."

21

Dies würde funktionieren ..

SwingUtilities.invokeLater(new Runnable() { 

public void run() { 
     Component.requestFocus(); 
    } 
}); 
3

Beachten Sie, dass alle oben genannten Gründe in einem JOptionPane fehlschlagen. Nach viel Versuch und Irrtum (mehr als die oben angegebenen 5 Minuten, sowieso), ist hier, was schließlich arbeitete:

 final JTextField usernameField = new JTextField(); 
// ... 
     usernameField.addAncestorListener(new RequestFocusListener()); 
     JOptionPane.showOptionDialog(this, panel, "Credentials", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); 


public class RequestFocusListener implements AncestorListener { 
    @Override 
    public void ancestorAdded(final AncestorEvent e) { 
     final AncestorListener al = this; 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final JComponent component = e.getComponent(); 
       component.requestFocusInWindow(); 
       component.removeAncestorListener(al); 
      } 
     }); 
    } 

    @Override 
    public void ancestorMoved(final AncestorEvent e) { 
    } 

    @Override 
    public void ancestorRemoved(final AncestorEvent e) { 
    } 
} 
+1

Vielen Dank für diese Lösung. Dies ist der einzige Weg es funktionierte .. – MyPasswordIsLasercats

3

Sie können JComponent.grabFocus(); auch ist es die gleichen

+0

Javadoc für [JComponent.grabFocus()] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#grabFocus--) gibt explizit an, dass diese Methode sollte wird nicht vom Client-Code verwendet und schlägt vor, die Methode 'requestFocusInWindow()' zu verwenden, die bereits in anderen Antworten erwähnt wird. –

Verwandte Themen