所以我stolen this cool PopupComposite
,我真的很满意。
只有一个问题。如果它放入org.eclipse.swt.widgets.Text
,我打开弹出窗口,关注Text
,然后按 ESC ,然后按Text
和{{1}处置自己。
我真的无法弄清楚处理来电的来源。这是PopupComposite
问题吗?我应该在弹出窗口中使用Shell
什么?
SSCCE :
Shell
答案 0 :(得分:2)
原因是当您关注文本字段并按Escape时,该字段会向其父shell发送SWT.TRAVERSE_ESCAPE
事件。 shell(在您的情况下不是顶级shell)通过调用Shell.close()
来响应。您可以通过向文本字段添加遍历侦听器来解决此问题,这将取消事件(下面的代码)。
new Text(popup, SWT.NONE).addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if(e.detail == SWT.TRAVERSE_ESCAPE) {
e.doit = false;
}
}
});
请注意,这是针对您的具体问题的一个相当粗略的解决方案。除了测试目的,我不建议将其用于任何其他目的。你可以在这里阅读更多相关信息 - > http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fevents%2FTraverseEvent.html
答案 1 :(得分:0)
因为我的“bug”实际上是SWT平台的正常行为,所以我使用了以下解决方法:
/**
* Lazy initialization of the popup composite
*/
private void createPopup()
{
// popupContainer is now a field
if (popupContainer != null && !popupContainer.isDisposed())
return;
// ... create popup AND its contents ...
}
并在按钮监听器中:
createPopup();
popup.show( Display.getDefault().map(parent, null, button.getLocation()) );
谢谢@blgt