我有TitleAreaDialog
TableViewer
,允许用户从表中选择一行。问题是,表格的内容可能会随着时间而改变。我想实现浏览器中常见的刷新行为(例如,通过按 F5 表的内容应该刷新)。
下面是截图,希望能让场景更加清晰:
this question似乎有一个可能的解决方案,但我认为它存在缺陷有几个原因:
Display
上有两个过滤器)TitleAreaDialog
或Widget
。TitleAreaDialog
一起处理) 长话短说:在不使用过滤机制的情况下,将KeyListener
添加到TitleAreaDialog
(或一般Dialog
)的正确方法是什么?在aforementioned question?
我知道这个问题在SSCCE部门有些失败,但任何指向正确方向的指标都受到高度赞赏。
答案 0 :(得分:1)
为关键事件添加Listener
是件棘手的事情。您希望Listener
在所有包含的Control
都没有焦点时触发,即使Dialog
的孩子有焦点也希望触发它。
这个问题基本上有两个解决方案:
addFilter
时使用Dialog
,在关闭对话框时使用removeFilter
(在close()
中)。Listener
创建SWT.KeyUp
,并将其添加到Dialog
的所有子项中。这对于事件独立于焦点控制而发射是必要的。我更喜欢解决方案1,因为它不那么混乱,SWT会处理所有事情(好吧,除了添加和删除过滤器)。向所有子控件添加Listener
是你真正应该做的,但它也可以完成这项工作。
如果您不想每次都添加和删除过滤器,请创建一次执行此操作的子类Dialog
或TitleAreaDialog
,然后再次通过子类重用它。
如果添加和删除过滤器一般都太麻烦了,那么恐怕没有更容易的解决方案。