Java 模拟SWT中按下的TAB键

Java 模拟SWT中按下的TAB键,java,events,swt,listener,Java,Events,Swt,Listener,我试图在SWT中模拟tab键按下事件,但我找不到任何方法来实现这一点 我有一个包含一个texfield、一个ListViewer和一个按钮的组合 当我在文本字段中按tab键时,我想将焦点设置在按钮上,而不是列表查看器上。你调查过这个家伙吗 我还没有尝试过这种方法,但是上面的代码片段改变了选项卡顺序。有两种方法可以解决这个问题: 定义一个所谓的“制表顺序”,它告诉父对象按给定顺序遍历其子对象 听SWT。遍历,阻止事件并手动强制聚焦按钮 以下是两种解决方案的一些代码: 一, 二, 您想更改选项卡顺

我试图在SWT中模拟tab键按下事件,但我找不到任何方法来实现这一点

我有一个包含一个texfield、一个ListViewer和一个按钮的组合


当我在文本字段中按tab键时,我想将焦点设置在按钮上,而不是列表查看器上。

你调查过这个家伙吗


我还没有尝试过这种方法,但是上面的代码片段改变了选项卡顺序。

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

  • 定义一个所谓的“制表顺序”,它告诉父对象按给定顺序遍历其子对象
  • SWT。遍历
    ,阻止事件并手动强制聚焦按钮
  • 以下是两种解决方案的一些代码:

    一,

    二,


    您想更改选项卡顺序。对于此用途
    setTabList(Control[])
    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();
    }
    
    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();
    }