java - 如何停止 swt 上的按键事件传播

标签 java swt

我有文本小部件和该文本小部件的 KeyDown 事件。

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的按钮小部件上。

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

myButton.addKeyListener(new KeyListener() {

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

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

最佳答案

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

正如您从 SSCCE 中看到的那样下面,TraverseListener 首先收到通知。您可以在那里取消 Activity 。

/**
 * 
 * @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.");
            }
        });
    }
}

关于java - 如何停止 swt 上的按键事件传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19023517/

相关文章:

java - AWS Java SDK 为 iOS 发送带声音的 SNS (AWS) 消息应该是什么 Json 字符串?

java - 使用 sql 加载器加载数据时出错。无法运行程序 "sqlldr": error=13, 权限被拒绝

java - JPA EJB PersistenceContext 没有注入(inject) EntityManager

java - 调整表格列的大小以填充所有可用空间

java - 如何显示 SWT 表中的行号

java - 无法将类型 [java.lang.String] 的属性值转换为所需类型 [java.time.LocalDate]

java - 需要创建 Java JAR 文件并将其添加到 Maven Dependency

java - 使用按钮清除文本字段 (Java)

java - 将静态方法传递给按钮工厂 (Java)

java - 如何在不给出静态列宽的情况下创建具有多列的 Java SWT 表