【问题标题】:How to listen for paste keyboard shortcut in SWT如何在 SWT 中监听粘贴键盘快捷键
【发布时间】:2017-08-09 08:35:56
【问题描述】:

我想在 SWT 中全局监听 CTRL + v。我可以成功收听 CTRL + c 但粘贴在 SWT 中的处理方式似乎有所不同。以下Listener 显示了它如何用于复制以及如何不适用于粘贴:

display.addFilter(SWT.KeyDown, new Listener() {

        private final int CTRL = SWT.MOD1;
        private boolean checkNextEventForPaste = false;

        @Override
        public void handleEvent(Event event) {
            if(event.stateMask == CTRL && event.keyCode == 'c'){
                System.out.println("copy: this works!");
            }
            else if(event.stateMask == CTRL && (event.keyCode == 'v'
                    || event.keyCode == 'V'
                    || event.keyCode == 0x16
                    || event.keyCode == 118)){
                System.out.println("paste: does not work!");
            }

            else if (event.keyCode == CTRL){
                //control for paste is fired first
                checkNextEventForPaste  = true;
            }
            else if(checkNextEventForPaste){
                if(event.keyCode == 65536){
                    System.out.println("custom solution: seems to not only apply for paste");
                }
                checkNextEventForPaste = false;
            }
        }

    });

我调试了粘贴案例并创建了一个自定义解决方案。粘贴键盘快捷键创建以下事件序列:

  • 首先是eventstateMask = 0keyCode = CTRL
  • 第二个eventstateMask = 0keyCode = 65536

问题在于自定义粘贴解决方案似乎也适用于其他快捷方式。例如,复制快捷方式创建以下事件序列:

  • 首先是 eventstateMask = 0keyCode = CTRL
  • 第二个eventstateMask = CTRLkeyCode = 'c'
  • 第三个eventstateMask = 0keyCode = 65536

为什么 SWT 以不同的方式处理粘贴快捷方式?粘贴快捷方式是否可能已被其他控件使用?或者有人知道我如何识别粘贴快捷方式吗? VerifyListener 不适用于我的用例。我已经使用自定义选择实现了一个或多或少复杂的 UI,如您所见 here

【问题讨论】:

    标签: java swt copy-paste keydown ctrl


    【解决方案1】:

    下面的代码对 Ctrl+cCtrl+v

    都适用
    public static void main(String[] args)
    {
        final Display d = new Display();
        Shell s = new Shell(d);
    
        d.addFilter(SWT.KeyDown, e ->
        {
            if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'c'))
            {
                System.out.println("copy");
            }
            else if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'v'))
            {
                System.out.println("paste");
            }
        });
    
        s.pack();
        s.open();
    
        while (!s.isDisposed())
        {
            if (!d.readAndDispatch())
                d.sleep();
        }
        d.dispose();
    }
    

    【讨论】:

    • 感谢您的回答。这使我得出的结论是,这个问题是由 eclipse 和编辑器环境引起的,其中动作确实消耗和处理此类事件
    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2014-05-29
    • 1970-01-01
    • 2011-04-08
    • 2022-01-02
    • 1970-01-01
    • 2017-09-19
    • 2023-03-27
    相关资源
    最近更新 更多