为什么requestFocusInWindow()会失败?

时间:2014-02-11 17:20:12

标签: java swing focus

我的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焦点获得

但我没有。如果该字段可见,可聚焦和启用,为什么会失败?

2 个答案:

答案 0 :(得分:1)

好的,误报警。问题是由于一些复杂的代码造成的。这个表单存在于JTabbedPane中,并且在这种特殊情况下,选项卡索引没有被设置,但是其他东西使得表单稍后可见。在做出焦点决定的那一刻,表格不可见或无法集中精力。

不知何故,分析here让我看到了。

上面的updateFieldEditability()方法可能已经检查过,在执行任何操作之前,父级也是可见的,启用的和可聚焦的。

答案 1 :(得分:0)

  

我正在寻找的是一种调试策略

您的事件侦听器中可能有一些代码正在操纵焦点并覆盖您的焦点请求。

尝试将您的requestFocusInWindow()语句包装在SwingUtilities.invokeLater()中,以便在处理完所有其他事件后将代码添加到EDT的末尾。