2009-04-06 15 views

Antwort

29

JFrame.getFocusOwner() (geerbt von Window.getFocusOwner()) sollte einen Verweis auf die Komponente mit Fokus zurückgeben. getMostRecentFocusOwner() könnte auch von Interesse sein.

1

This Tutorial sollte ziemlich hilfreich sein, um den Fokus zu verstehen.

0

Jede JComponent verfügt über eine hasFocus-Methode, mit der Sie überprüfen können, ob der Fokus vorhanden ist. Dies wurde jedoch geändert, und jetzt sollten Sie isFocusOwner verwenden.

So über alle Textfelder in Ihrem Rahmen laufen, und überprüfen Sie jedes von ihnen, wenn es IsFocusOwner ist, indem Sie diese Methode aufrufen.

Sie könnten auch den Fokus Besitzer durch den Rahmen erhalten.

+7

Scheint wirklich ineffizient. Sie können einfach KeyboardFocusManager.getCurrentKeyboardFocusManager() aufrufen. GetFocusOwner(); –

2

getFocusOwner() die untergeordnete Komponente zurück, die derzeit fokussiert.

Aber Sie müssen überprüfen, ob es ein JTextField ist. Andere Komponenten wie Schaltflächen können fokussiert werden, wenn sie auch in Ihrem Rahmen vorhanden sind.

23
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() 
+1

Viel besser als die angenommene Antwort, IMHO, da ich dies von einer statischen Klasse tun kann, die keinen Zugriff auf das Fenster habe, das ich tatsächlich verwende, und ich muss nicht alle Fenster durchlaufen. –

1

KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
arbeiten nicht über Threads. Wenn deine App also einen neuen Thread aufruft und dieser Thread sein eigenes Frame/Fenster usw. hat, wird es nicht möglich sein, den Fokus-Besitzer von diesem Thread zu erhalten. Verwenden Sie stattdessen: KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner();

+0

okay, das Lesen der api doc hilft (mich :-) zu verstehen, was du vielleicht meinst. Es gibt das _Returns der Fokusbesitzer zurück, wenn sich der aufrufende Thread in einem anderen Kontext als dem Fokus owner_ befindet - es ist jedoch in Anwendungscode nicht verwendbar, da sein Bereich geschützt ist. Es wird nur intern verwendet ... – kleopatra

+1

Swing ist eine single-threaded-Umgebung, alle UI-Interaktionen MÜSSEN aus dem Kontext des Event Dispatching-Thread heraus geschehen, es ist unmöglich, zwei Fenster innerhalb derselben JVM in verschiedenen Threads zu haben, das ist nicht wie API funktioniert – MadProgrammer

Verwandte Themen