模拟在SWT中按下的TAB键

时间:2018-03-06 10:41:45

标签: java events swt listener

我正在尝试模拟SWT中的Tab键按下事件,但我找不到任何方法来执行此操作。

我有一个复合包含一个texfield,一个ListViewer和一个按钮。

当我在文本字段中按Tab键时,我想将焦点设置在按钮上,而不是在ListViewer上。

2 个答案:

答案 0 :(得分:0)

你调查了这个人吗?

http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet241.java

我还没有尝试过这类事情,但上面的代码段更改了标签顺序。

答案 1 :(得分:0)

有两种方法可以解决这个问题:

  1. 定义一个所谓的“Tab键顺序”,它告诉父级以给定的顺序遍历其子级。
  2. 收听SWT.Traverse,阻止该事件并手动强制关注该按钮。
  3. 以下是两种解决方案的代码:

    1

    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("StackOverflow");
        shell.setLayout(new FillLayout());
    
        Button button = new Button(shell, SWT.PUSH);
        button.setText("Button");
        Text text = new Text(shell, SWT.BORDER);
        new Text(shell, SWT.BORDER).setText("This won't get focused.");
    
        shell.setTabList(new Control[] {text, button});
    
        shell.pack();
        shell.open();
    
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        display.dispose();
    }
    

    2

    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("StackOverflow");
        shell.setLayout(new FillLayout());
    
        Button button = new Button(shell, SWT.PUSH);
        button.setText("Button");
        Text text = new Text(shell, SWT.BORDER);
        new Text(shell, SWT.BORDER).setText("This won't get focused.");
    
        text.addListener(SWT.Traverse, e -> {
            if(e.detail == SWT.TRAVERSE_TAB_NEXT)
            {
                e.doit = false;
                button.forceFocus();
            }
        });
    
        shell.pack();
        shell.open();
    
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        display.dispose();
    }