如何在 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()方法)