【问题标题】:Listeners in forms with JComponents带有 JComponents 的表单中的侦听器
【发布时间】:2012-11-12 08:23:35
【问题描述】:

现在,当我有一个包含许多 JComponents 的表单时,主要是 JTextFields、JTextAreas、JComboboxes、JCheckBoxes 和 JButtons,并且想要控制它们的行为,例如释放某个键后焦点的变化,我会执行以下操作:

我将所有组件放在 JComponent[] 中并循环访问它,添加适当的侦听器。当所述侦听器注册事件时,我使用“instanceof”检查哪种 JComponent 触发了该事件并分配适当的反应。

我使用这种方法来循环使用 VK_ENTER 通过表单,或者在 DocumentListener 触发后到“firePropertyChange(..)”,或者添加 UndoRedoListeners 等等。

我的问题:有没有更好的方法来做到这一点,如果有,你能向我解释一下好处吗?

【问题讨论】:

  • 如果FocusManager 不是答案,我不明白这个问题。
  • FocusManager 是一个很好的提示,但我的问题是指将所有 JComponents 放在一个数组中并为每个侦听器和每个触发事件循环遍历它们的一般做法。它工作得很好,但感觉有点“不经济”,所以我想知道是否推荐这样做,或者是否有更好的方法。
  • 听起来你做的事情基本上是错的(从未有过这样的愿望/需要)退后一步,解释一下你想做什么实现(相对于描述感知解决方案的问题)
  • 抱歉,我的问题似乎没有说清楚。普斯明白我在问什么,他的回答至少表明了这一点。我会再试一次:给定一个表单上可能有大量和多种 JComponent,我需要为许多不同的事件分配侦听器;注册事件后执行的操作通常取决于特定类型的 JComponent。目前,我所做的如上所述(循环通过 JComponent[],使用“instanceof”检查)。有没有更好的方法(可能是 Puce 的?)?

标签: java swing listener


【解决方案1】:

但我的问题是指将所有 数组中的 JComponents 并为每个侦听器循环遍历它们 以及每个触发的事件。它工作得很好,但感觉有点 “不经济”,所以我想知道是否建议这样做,或者是否 有更好的方法。

如果我有特定于类型/实例的行为,我通常会为每个类型/实例编写一个自定义侦听器(通常作为匿名类),这样我就可以避免 instanceof 和其他检查。

【讨论】:

    【解决方案2】:

    您需要自定义焦点转移系统。

    看看How to Use the Focus Subsystem,尤其是Customizing Focus Traversal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多