我的Java swing app在组件上调用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 visible:true,focusable:true,enabled:true
从代码中,只有在requestFocusInWindow()失败时才会执行此操作。
我希望在日志中看到的是
fwdNumberField焦点获得
但我没有。如果该字段可见,可聚焦和启用,为什么会失败?
答案 0 :(得分:1)
不知何故,分析here让我看到了。
上面的updateFieldEditability()方法可能已经检查过,在执行任何操作之前,父级也是可见的,启用的和可聚焦的。
答案 1 :(得分:0)
我正在寻找的是一种调试策略
您的事件侦听器中可能有一些代码正在操纵焦点并覆盖您的焦点请求。
尝试将您的requestFocusInWindow()语句包装在SwingUtilities.invokeLater()中,以便在处理完所有其他事件后将代码添加到EDT的末尾。