【发布时间】:2010-10-17 17:44:29
【问题描述】:
我的Frame 中有几个TextFields。我想知道哪个TextField 目前有焦点。我怎样才能找到这些信息?
【问题讨论】:
我的Frame 中有几个TextFields。我想知道哪个TextField 目前有焦点。我怎样才能找到这些信息?
【问题讨论】:
你可以像这样获得当前关注的组件:
Component focusOwner = FocusManager.getCurrentManager().getFocusOwner();
之后你可以检查focusOwner是否是TextField的实例
【讨论】:
您还可以在键盘焦点管理器中监听适当的属性变化:
KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println(evt.getNewValue());
}
});
这会在您与 Swing 组件交互时输出焦点所有者,并且通常对于调试焦点问题很有用。
【讨论】:
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
不会跨线程工作。因此,如果您的应用程序调用一个新线程并且该线程具有自己的框架/窗口等,那么它将无法从该线程获得焦点所有者。改为使用:KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner();
【讨论】:
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()
【讨论】:
【讨论】:
getFocusOwner() 将返回当前焦点所在的子组件。
但是你必须检查它是否是一个 JTextField。如果其他组件(例如按钮)也存在于您的框架中,它们可能会被聚焦。
【讨论】:
JFrame.getFocusOwner()(继承自Window.getFocusOwner())应该返回对具有焦点的组件的引用。 getMostRecentFocusOwner() 也可能感兴趣。
【讨论】:
每个 JComponent 都有一个 hasFocus 方法,您可以使用它来检查它是否有焦点。 但是,这已被更改,现在您应该使用 isFocusOwner。
因此,遍历框架中的所有文本字段,并通过调用该方法检查每个字段是否为 isFocusOwner。
您还可以让焦点所有者通过框架。
【讨论】:
This 教程应该对理解焦点很有帮助。
【讨论】: