java为什么requestFocusInWindow()会失败?
我的Java swing应用程序在组件上调用requestFocusInWindow()。该组件是可聚焦、可见和启用的。它的父对象是可见的。但是requestFocusInWindow()返回false,焦点转移到其他地方。如果我四处搜索,就可以找到所需的组件,并且可以获得焦点
为什么requestFocusInWindow()在这种情况下会失败
(请不要建议一个简单的测试程序。我相信在这种情况下我不会有这个问题。我要寻找的是一种针对存在这个问题的复杂情况的调试策略)
下面是一段代码:
public void setFormFocus() {
log.trace("BillingForm.setFormFocus()");
// sets latest enablement status of each field
updateFieldEditability();
SwingUtilities.invokeLater(fwdNumberFocus);
};
private Runnable fwdNumberFocus= new Runnable() {
public void run() {
log.trace("fwdNumberFocus.run()");
if (!fwdNumberField.hasFocus()) {
if (fwdNumberField.requestFocusInWindow() == false){
log.debugf("fwdNumberField visible: %s, focusable: %s, enabled: %s", fwdNumberField.isVisible(), fwdNumberField.isFocusable(), fwdNumberField.isEnabled());
focusOnFirstFocusableItem();
}
else{
log.debug("fwdNumberField focus gained");
}
}
}
};
执行此操作时,fwdNumberFocus中的log语句显示为
fwdNumberField visible: true, focusable: true, enabled: true
根据代码,只有在requestFocusInWindow()失败时才会执行此操作
我希望在日志中看到的是
fwdNumberField focus gained
但是我没有。如果这个字段是可见的、可聚焦的和启用的,为什么会失败呢
# 1 楼答案
您的事件侦听器中可能有一些代码正在操纵焦点,并覆盖焦点请求
尝试将requestFocusInWindow()语句包装在SwingUtilities中。invokeLater()以便在处理完所有其他事件后,将代码添加到EDT的末尾
# 2 楼答案
好吧,假警报。问题是由于一些复杂的代码。该表单位于JTabbedPane中,在这种特殊情况下,不知何故没有设置选项卡索引,但后来有其他东西使表单可见。在做出聚焦决定的那一刻,表单不可见或不可聚焦
不知怎的,分析使我看到了这一点
也许,我上面的UpdateFildeditability()方法应该在做任何事情之前检查父对象是否也可见、已启用和可聚焦