有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

但是我没有。如果这个字段是可见的、可聚焦的和启用的,为什么会失败呢


共 (2) 个答案

  1. # 1 楼答案

    What I am looking for is a debugging strategy

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

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

  2. # 2 楼答案

    好吧,假警报。问题是由于一些复杂的代码。该表单位于JTabbedPane中,在这种特殊情况下,不知何故没有设置选项卡索引,但后来有其他东西使表单可见。在做出聚焦决定的那一刻,表单不可见或不可聚焦

    不知怎的,分析使我看到了这一点

    也许,我上面的UpdateFildeditability()方法应该在做任何事情之前检查父对象是否也可见、已启用和可聚焦