如何在 ESC 键上调用自定义侦听器而不是默认的 shell 侦听器?

Posted

技术标签:

【中文标题】如何在 ESC 键上调用自定义侦听器而不是默认的 shell 侦听器?【英文标题】:How to call a custom listener upon ESC key instead of default shell listener? 【发布时间】:2018-06-01 21:08:37 【问题描述】:

我有一个扩展 ColumnViewerToolTipSupport 的类。此类覆盖createViewerToolTipContentArea() 并为工具提示提供自定义内容。

当工具提示打开时按下 ESC 键时,将调用 shell.close() 方法。即使我在工具提示 shell 中添加了一个关键侦听器,也会调用 shell.close() 本身。

下面的监听代码:

   @Override
    protected Composite createViewerToolTipContentArea(Event event, ViewerCell cell, final Composite shell) 

        Display.getDefault().getActiveShell().addListener(SWT.KeyDown, new Listener() 
            @Override
            public void handleEvent(final Event event) 
                if (event.type == SWT.KeyDown) 
                    System.out.println("key pressed ..........close shell");
                
            
        );

这里有什么错误吗??

【问题讨论】:

只听一个事件不会改变其他听者的行为。 我可以在这里做什么来调用我的监听器而不是 shell 监听器?? 您可以尝试调用getListeners(SWT.KeyDown),然后删除监听器。 【参考方案1】:

如果您检查 ToolTip 类(它是 ColumnViewerToolTipSupport 的基类),您会发现没有选项可以更改事件处理。它使用一个私有监听器实现来监听 keydown(甚至不仅是 ESC)和其他事件。

他们提供的唯一 API 是 afterHideToolTip(Event event),您可以在其中检查事件的 ESC 键。但是你只能做额外的事情。没有 beforeHideToolTip 可以决定你喜欢用 tooltip 事件做什么。

对于您为什么添加侦听器没有帮助的问题:它们只是被添加了。其他监听器也被执行。

【讨论】:

【参考方案2】:

你可以试试这个:

event.doit = false;

这应该可以解决问题。

【讨论】:

以上是关于如何在 ESC 键上调用自定义侦听器而不是默认的 shell 侦听器?的主要内容,如果未能解决你的问题,请参考以下文章

Qt编程中QDiaog的ESC键(按下Esc键会默认调用reject()方法)

Swift如何兼顾协议中默认和自定义方法的调用?

qt之esc键

如何将默认蓝色注释用于用户位置而不是我的自定义注释?

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

如何使searchResultsTableView使用自定义单元格而不是默认单元格[重复]