Swt FormToolkit焦点问题

时间:2011-11-09 10:05:08

标签: java eclipse forms swt jface

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

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

那么,有没有人遇到类似的问题,或者是否有任何解决方法可以解决这个问题或任何线索可能是什么?

Upd1:设置NO_FOCUS样式有助于非TableComboViewer小部件(在这种情况下,它们没有获得焦点)。在TableComboViewer的情况下,TableCombo小部件包含Text小部件,它接收焦点,但即使如果我添加NO_FOCUS位,它也不会应用于Text样式。我已经检查了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,我可以以某种方式抑制它吗?

更新2:据说,原因可能是:

  

当激活视图时,焦点将转移到表单,表单将其传递给第一个能够接受焦点的控件,在这种情况下我们的链接。

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

提前致谢, AlexG

1 个答案:

答案 0 :(得分: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 ();
} 

正如您所看到的,这将尝试将焦点设置在合成中的第一个控件上,以便进行焦点...

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

如果上述方法不适用MouseListener中所有Composites上安装的FormToolkit.adapt(Composite composite),则上述方法不会出现问题:

    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()交换。虽然这偶尔会给你带来其他问题......