【问题标题】:Adding KeyListener to TitleAreaDialog将 KeyListener 添加到 TitleAreaDialog
【发布时间】:2014-03-10 11:04:45
【问题描述】:

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

下面是一个屏幕截图,希望能让场景更清晰一些:

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

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

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

我知道这个问题在 SSCCE 部门有些失败,但任何指向正确方向的指针都非常感谢。

【问题讨论】:

    标签: java swt jface keylistener titleareadialog


    【解决方案1】:

    为关键事件添加Listener 是一件棘手的事情。您希望Listener 在包含的Controls 都没有焦点时被触发,并且即使Dialog 的子元素有焦点,您也希望它触发。

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

    1. 显而易见的选择:在创建Dialog 时使用addFilter,在关闭对话框时使用removeFilter(在close() 中)。
    2. SWT.KeyUp 创建一个Listener 并将其添加到Dialog所有 个子项。这是独立于焦点控件触发事件所必需的。

    我更喜欢解决方案 1,因为它不那么混乱,而且 SWT 会处理所有事情(嗯,除了添加和删除过滤器)。向所有子控件添加 Listener 并不是您真正应该做的事情,但它也可以完成这项工作。


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

    如果添加和删除过滤器一般来说太麻烦,那么恐怕没有更简单的解决方案。

    【讨论】:

    • 感谢您花时间回答。我实施了解决方案 1,它按预期工作。
    • @Matt Brilliant。很高兴我能帮上忙。
    猜你喜欢
    • 2013-12-24
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多