将KeyListener添加到TitleAreaDialog

时间:2014-03-10 11:04:45

标签: java swt jface keylistener titleareadialog

我有TitleAreaDialog TableViewer,允许用户从表中选择一行。问题是,表格的内容可能会随着时间而改变。我想实现浏览器中常见的刷新行为(例如,通过按 F5 表的内容应该刷新)。

下面是截图,希望能让场景更加清晰:

this question似乎有一个可能的解决方案,但我认为它存在缺陷有几个原因:

  • 听众没有正确分离(例如,如果我重新打开对话框,我的Display上有两个过滤器)
  • 从构建的角度来看,它不会将监听器添加到我认为属于的TitleAreaDialogWidget
  • 我想避免手动监听器附加/分离(例如,监听器应与TitleAreaDialog一起处理)

长话短说:在不使用过滤机制的情况下,将KeyListener添加到TitleAreaDialog(或一般Dialog)的正确方法是什么?在aforementioned question

中描述

我知道这个问题在SSCCE部门有些失败,但任何指向正确方向的指标都受到高度赞赏。

Dialog with TableViewer

1 个答案:

答案 0 :(得分:1)

为关键事件添加Listener是件棘手的事情。您希望Listener在所有包含的Control都没有焦点时触发,即使Dialog的孩子有焦点也希望触发它。

这个问题基本上有两个解决方案:

  1. 显而易见的选择:在创建addFilter时使用Dialog,在关闭对话框时使用removeFilter(在close()中)。
  2. Listener创建SWT.KeyUp,并将其添加到Dialog所有子项中。这对于事件独立于焦点控制而发射是必要的。
  3. 我更喜欢解决方案1,因为它不那么混乱,SWT会处理所有事情(好吧,除了添加和删除过滤器)。向所有子控件添加Listener是你真正应该做的,但它也可以完成这项工作。


    如果您不想每次都添加和删除过滤器,请创建一次执行此操作的子类DialogTitleAreaDialog,然后再次通过子类重用它。

    如果添加和删除过滤器一般都太麻烦了,那么恐怕没有更容易的解决方案。