SWT,添加Keylistener时保持默认选项卡顺序

时间:2009-07-21 21:38:39

标签: java winforms user-interface event-handling swt

我一直在创建一个自定义TabFolder扩展,它添加了一个关键监听器,允许使用ALT +#hotkey快速切换标签。

通过将KeyAdapter添加到我的TabFolder,只有当您选择了标签页时,事件处理程序才能正常工作(在这种情况下,ALT + ARROW_LEFT / ARROW_RIGHT也可以工作)。当TabFolder中的任何Widget处于活动状态时,我需要此热键处于活动状态;但是,如果选择位于选项卡文件夹之外的其他选项卡文件夹或窗口小部件中,则它不应处于活动状态。

为了解决这个问题,我写了一个简单的递归函数来将关键监听器应用于选项卡文件夹的所有子项:

public void applyQuickSwitchKeyBindings() {
    removeKeyListener(ka);
        addKeyListener(ka);
    for(Control c: getChildren())
        applyQuickSwitchKeyBindingsToChildren(c);

    }

private void applyQuickSwitchKeyBindingsToChildren(Control c) {

    if(c==null) return;
    if(c instanceof Composite) {
        Control[] controls = ((Composite)c).getChildren();
        for(Control c2: controls)
            applyQuickSwitchKeyBindingsToChildren(c2);
        if(controls.length < 1) {
            c.removeKeyListener(ka);
            c.addKeyListener(ka);
        }
    }
}

然后,在将控件添加到选项卡组中的每个TabItem之后,我调用applyQuickSwitchKeyBindings()。

好消息是快速切换热键(ALT +#)效果很好!

坏消息是,基于z-index的原始TAB排序现已消失。当您点击SWT.TAB键时,您将失去对当前文本框的关注,并且无法专注于其他任何内容......

问题:

1。)每个控件只能有一个KeyListener吗?

2.。)为什么原来的TAB遍历不再起作用了?

提前致谢!

2 个答案:

答案 0 :(得分:0)

到1)我很确定允许多个KeyListener。

到2)我不确定,这取决于你在KeyAdapter中做了什么。也许你也可以发帖呢?

我只是以某种方式破坏了标签顺序,您可以通过调用setTabList( Control[] )来重置(或更改)它。

setTablList( new Control[] {
    control1,
    control2,
    control3,
    ....
} );

答案 1 :(得分:0)

因此,经过SWT学习和开发的更多时间后,我发现了我的问题。添加侦听器时,它将应用于您调用addXXXListener函数的窗口小部件/控件。因此,如果该控件未激活,则不会触发侦听器。

解决方案似乎是SWT的全局过滤机制,它允许您添加全局应用程序(显示)范围监听器。

Display.getCurrent().addFilter(SWT.keyPress, new KeyPressListener());

请原谅这条线的不正确之处,但是如果你谷歌它就会明白我的意思。

我也读过谨慎使用这个。