【问题标题】:Swt FormToolkit focus issueSwt FormToolkit 焦点问题
【发布时间】:2011-11-09 10:05:07
【问题描述】:

我有一个奇怪的问题:有一个带有复合的 SectionPart,它是从 FormToolkit#createComposite(getSection()) 创建的。 Composite 包含一些小部件,它们垂直放置在另一个下方(如通常的形式)。当光标在某个小部件内时,假设输入字段,并且我在空白区域的两个字段之间单击右键,然后焦点自动跳转到此组合中的第一个字段。

我尝试将 SWT.NO_FOCUS 样式位设置为表单中的第一个小部件(通常是 TableComboViewer),但没有帮助(似乎,该位未在 TableCombo 上设置,它在里面TableComboViewer)。

那么,有没有人遇到过类似的情况,或者是否有任何解决此问题的方法或任何线索?

Upd1:设置 NO_FOCUS 样式有助于非 TableComboViewer 小部件(在这种情况下,它们没有获得焦点)。如果 TableComboViewer TableCombo 小部件包含接收焦点的文本小部件,但即使我添加 NO_FOCUS 位,它也不会应用于文本样式。我检查了 TableCombo 的来源,并且有一个方法 checkStyle,它执行以下操作:

private static int checkStyle (int style) {
 int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
 return SWT.NO_FOCUS | (style & mask);
}

我实际上不确定它的作用,因为我在按位运算方面不是很好,但似乎这就是问题所在,为什么我不能设置 NO_FOCUS 标志。

但我不明白,为什么当我点击 Composite 时,它​​会尝试在它的孩子上设置 foxus,我可以以某种方式抑制它吗?

Upd2:原因大概找到了,据说是:

当视图被激活时,焦点被转移到表单,它把它传递给第一个能够接受焦点的控件,在这个例子中是我们的链接。

而且看来,这是不可能禁止的。

提前致谢, 亚历克斯G

【问题讨论】:

    标签: java eclipse forms swt jface


    【解决方案1】:

    你的问题出在Composite.setFocus()..看看这个:

    public boolean setFocus () {
        checkWidget ();
        Control [] children = _getChildren ();
        for (int i= 0; i < children.length; i++) {
            if (children [i].setFocus ()) return true;
        }
        return super.setFocus ();
    } 
    

    如您所见,这将尝试将焦点设置在组合中允许焦点的第一个控件上...

    [编辑 - 添加以下内容以澄清...]

    如果不是MouseListenerFormToolkit.adapt(Composite composite)中的所有Composites上都安装了MouseListener,上述方法不会有问题:

        public void adapt(Composite composite) {
            composite.setBackground(colors.getBackground());
            composite.addMouseListener(new MouseAdapter() {
                public void mouseDown(MouseEvent e) {
                    ((Control) e.widget).setFocus();
                }
            });
            if (composite.getParent() != null)
                composite.setMenu(composite.getParent().getMenu());
        }
    

    我已经多次解决了这个问题,方法是在一个做正确事情的子类中拥有自己的FormToolkit.adapt(Composite composite) - 我只是将setFocus()forceFocus() 交换。虽然这偶尔会给您带来其他问题...

    【讨论】:

    • 感谢您的回答。你当然是对的。但问题是我在我们的应用程序或其他地方找不到与其他合成类似的任何其他行为。我假设这是 FormToolkit 或 IManagedForm 特定的行为(在 Composite 上调用 setFocus,然后将焦点传递给某个小部件)。还是我错过了什么?我也尝试过 FormToolkit#adapt(composite, trackFocus, ..) 我的父复合,但它仍然是同样的问题。
    • 太好了,它确实有帮助!谢谢!
    猜你喜欢
    • 2011-03-07
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多