【问题标题】:Why might requestFocusInWindow() fail?为什么 requestFocusInWindow() 会失败?
【发布时间】: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() 如果包含该组件的窗口不活动,将会失败。

标签: java swing focus


【解决方案1】:

好吧,虚惊一场。问题是由于一些复杂的代码。此表单存在于 JTabbedPane 中,在这种特殊情况下,不知何故未设置选项卡索引,但其他一些东西使表单稍后可见。在做出焦点决定的那一刻,表单不可见或不可聚焦。

不知何故,here 的分析让我看到了这一点。

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

【讨论】:

    【解决方案2】:

    我要找的是调试策略

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

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

    【讨论】:

    • 我在问题中添加了更多细节。如您所见,我将我的方法包装在 invokeLater() 中,并且对为什么它不起作用感到困惑。
    • 另外,在 fwdNumberField 中有一个 FocusListener,但它对操作焦点没有任何作用。
    猜你喜欢
    • 2016-04-11
    • 2021-10-10
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多