【问题标题】:Using KeyboardFocusManager使用键盘焦点管理器
【发布时间】:2011-07-26 13:01:34
【问题描述】:

我正在尝试将一些 KeyEventPostProcessor 添加到几个弹出窗口中,对于我显示的每个弹出窗口,如下所示:

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {

        public boolean postProcessKeyEvent(KeyEvent e) {
            //do something
            return true;
        }
    });

但问题是“KeyEventPostProcessors 将按照添加的顺序得到通知”,我需要相反的顺序。我可以这样做吗?

【问题讨论】:

    标签: java swing keyboard focus


    【解决方案1】:

    您可以创建自己的实现KeyEventPostProcessor 的类,将所有其他处理器分配给它,并让您自己的类按照您喜欢的顺序调用处理器(显然只将您自己的处理器添加到KeyboardFocusManager。)但是,这只会在调用时返回单个返回值,而不是每个处理器都返回一个值。

    如果这是一个问题,那么您很可能必须移除所有处理器并重新添加它们。 KeyboardFocusManager 有一个名为getKeyEventPostProcessors() 的方法,它将返回所有处理器。您可以检索该列表,对其进行迭代并使用removeKeyEventPostProcessor() 删除处理器,首先添加您自己的,然后再次迭代列表并添加所有先前的处理器。然而,这将是相当低效的。

    如果您一次添加所有处理器但希望颠倒顺序,您可以暂时将它们保存到一个列表中,然后以相反的顺序遍历该列表,仅当您已经准备好所有处理器时才将它们添加到 KeyboardFocusManager。

    除了上述变通方法之外,Java API 中似乎没有任何方法可以真正使其以相反的顺序发送事件。

    【讨论】:

      【解决方案2】:

      这似乎微不足道,但如果这是您需要通知它们的顺序,请以相反的顺序添加它们。

      (如果您在循环中添加它们,只需以相反的顺序遍历它,如果您将它们作为来自其他类的调用添加,则存储添加直到所有弹出窗口完成并以相反的顺序添加存储的添加)

      【讨论】:

      • 问题是我永远不知道弹出窗口何时结束。它可能一直在添加和删除弹出窗口。
      • @elecay - 不明白您的问题(如最初所述)与何时/如果/如何删除弹出窗口有关。您的陈述是:“我需要颠倒顺序” - 对我来说,这意味着您知道要颠倒的顺序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多