【发布时间】:2014-02-11 17:20:12
【问题描述】:
我的 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 中的日志语句显示为
fwdNumberField 可见:true,可聚焦:true,启用:true
从代码来看,只有在 requestFocusInWindow() 失败时才会执行。
我期望在日志中看到的是
fwdNumberField 获得焦点
但我没有。如果该字段可见、可聚焦且已启用,为什么会失败?
【问题讨论】:
-
IIRC requestFocusInWindow() 如果包含该组件的窗口不活动,将会失败。