Java 如何停止swt上的关键事件传播

Java 如何停止swt上的关键事件传播,java,swt,Java,Swt,我有文本小部件和该文本小部件的按键事件 myText.addListener(SWT.KeyDown, new Listener() { @Override public void handleEvent(Event e) { if (e.keyCode == Keys.ENTER || e.keyCode == Keys.CARRIAGERETURN) { myButton.setFocus(); e.doit =

我有文本小部件和该文本小部件的按键事件

myText.addListener(SWT.KeyDown, new Listener() {
    @Override
    public void handleEvent(Event e) {
        if (e.keyCode == Keys.ENTER || e.keyCode == Keys.CARRIAGERETURN) {
            myButton.setFocus();
            e.doit = false;

        }
    }
});
我需要将焦点设置在一个按钮小部件上,该小部件有一个
KeyListener

问题是,当我在文本小部件上按Enter键时,它也会触发按钮小部件的
keyreased
事件。如何停止按钮的
keyreased
事件

myButton.addKeyListener(new KeyListener() {

    public void keyReleased(KeyEvent event) {
 if ( event.keyCode == Keys.ENTER ) {    
            //do Something
        }
    }
});

我尝试了
event.doit=false
,但没有成功。

我建议您不要使用自己的自定义
类,除非您的字段指向特定于SWT的键变量。(例如,
Keys.ENTER=SWT.TRAVERSE\u RETURN

从下面可以看到,
transverseListener
首先得到通知。你可以取消那里的活动

/**
 * 
 * @author ggrec
 *
 */
public class KeyTest
{

    // ==================== 3. Static Methods =============================

    public static void main(final String[] args)
    {
        new KeyTest();
    }


    // ==================== 4. Constructors ===============================

    private KeyTest()
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        createContents(shell);

        shell.pack();
        shell.open();
        while (!shell.isDisposed())
        {
            if ( !display.readAndDispatch() )
                display.sleep();
        }
        display.dispose();
    }


    // ==================== 5. Creators ===================================

    private static void createContents(final Composite parent)
    {
        final Text text = new Text(parent, SWT.NONE);

        text.addTraverseListener(new TraverseListener()
        {
            @Override public void keyTraversed(final TraverseEvent e)
            {
                System.out.println("Traversed!");
            }
        });

        text.addKeyListener(new KeyListener()
        {
            @Override public void keyReleased(final KeyEvent e)
            {
                System.out.println("Key released.");
            }

            @Override public void keyPressed(final KeyEvent e)
            {
                System.out.println("Key pressed.");
            }
        });
    }
}

看看这个:尝试使用遍历侦听器停止遍历事件上的事件。编辑:当然,巴兹在SWT问题上总是比我抢先一步@GGrec我的道歉;)请随意发布答案。顺便问一下:那个
类来自哪里?您的意思是为按钮添加遍历事件吗?但正如我发现的,在遍历事件之前调用了keyListener。即使我删除了CustomKeys类,也会发生同样的事情。我已经通过修改您的代码来检查了这一点。我添加了一个按钮和两个侦听器KeyListener和TraverseListener。从文本小部件的按键事件中,我将焦点设置为按钮小部件。按钮的keyListener在按钮的TraverseListener之前被调用。@Sharif是否是
setFocus
触发
TraverseEvent