【问题标题】:Java Swing GUI User actions handlingJava Swing GUI 用户操作处理
【发布时间】:2014-12-24 12:29:24
【问题描述】:

Listeners 等应该如何管理?我发现只有一个按钮等的例子。

我可以想到以下选项:

  1. 每个额外的类 - 似乎不正确,尤其是当项目 可以动态创建
  2. 每个组的类(例如form1, form2, controlButtonsOnLeft, controButtonsOnRight, mainMenu, userMenu, ...) 我将在其中检查哪个按钮/组件导致此问题 (例如通过 getSource 方法)
  3. 一些超(大)控制器, 它将接受所有用户操作
  4. 为每个新的匿名类, 它将调用控制器的方法并指定参数 详细信息(可能是枚举)

还有一个问题:我找到了很多 MVC 的例子,我想知道什么对 app.js 更好(或常用)。由 1 人开发(应用不会很大)?

A. Viewer 将监听器设置为控制器 (A1-3)

B.控制器调用查看器的方法,该方法接受监听器作为参数(方法 addLoginSubmitListener、addControlBoldButtonListener 等)

以上都可以实现,目前我会选择B4。 控制中的意义我会做这样的事情:

...
viewer.addLoginButtonListener(new Listener()
{
  @Override
  public void actionPerformed(ActionEvent e) {
    ...
    someButtonsActionHandler(SomeButtonEnum, ActionEnum);
    ...
  }
});
...
private void LoginActionHandler(LoginElementsEnum elem, ActionEnum action)
{
  if (elem.equals(LOGINBUTTON)) {...}
  ...
}
...

这结合了可读的代码(1 个逻辑部分在代码的一个位置),不会创建任何不需要的冗余代码,不需要任何几乎动态的检查,易于重用等等。 你能确认/评论这个解决方案吗?

【问题讨论】:

  • 当对监听器使用匿名实现时,您以后在处理对象时无法删除它们,这最终会(并且您遇到这些情况)导致内存泄漏。
  • @alterfox:感谢指点。
  • @alterfox:这不是GC处理的吗?监听器列表是此类匿名监听器的唯一参考,它会在组件处理过程中被清空,对吧?又或者我理解错了。在这种情况下,我将为此创建一个类并为构造函数添加一个参数,该参数将决定哪个方法将处理它。 [也许有更好的解决方案,这是我想到的第一个]
  • 例如B 开始监听 A。这意味着 B 的监听器出现在 A 的监听器列表中。后来,B被处置,A继续生活。监听器是强引用,阻止GC释放B的资源,所以需要去掉。这当然是如果监听器没有被构造成弱监听器,这就是另外一个话题了。

标签: java swing user-interface model-view-controller listeners


【解决方案1】:

说实话,这个问题归结为几个问题......

  • 您想要可重用性吗?
  • 您想要可配置性吗?
  • 它们是自给自足的吗?也就是说,让其他人监听组件是否有意义,或者将来需要修改监听器的结果操作?

就个人而言,我倾向于自我控制。给定操作/任务的单个侦听器。这让我在需要时更容易管理和更改。

如果我不需要(侦听器的)可重用性或可配置性,那么匿名内部类通常是首选。它隐藏了功能,并且不会因为使用过的小类而使源代码混乱。您应该注意,它可能会使源代码难以阅读。这当然假设任务是专门构建的(它是一个单独的、孤立的案例)。通常,在这些情况下,我更愿意从侦听器中调用其他实际完成工作的方法,这为类提供了一定程度的灵活性和可扩展性。您经常发现自己想要修改组件的行为,却发现隐藏在匿名或私有内部类中的行为...

如果您想要可重用性和/或可配置性 - 即侦听器执行可以在整个程序中重复或通过库随时间重复的常见任务,那么您将需要为该任务提供专用类。同样,我更喜欢一个独立的解决方案,所以任何一个听众只做一项工作,更容易改变一个听众,然后不得不挖掘if-else语句的复合列表:P

这也可以是一系列abstract 侦听器,它们可以为类似操作构建功能,例如从表中删除行...

您可以考虑类似Action API(有关更多详细信息,请参阅How to Use Actions),它们是独立的工作单元,但也带有配置信息。它们旨在与按钮配合使用,例如 JButtons 和 JMenuItems,但也可以与键绑定一起使用,使其用途广泛...

您问题的第二部分(关于 MVC)取决于。我更喜欢将 UI 相关的功能尽可能地保留在视图中和控制器之外。我更愿意为控制器/视图交互提供我自己的专用侦听器,而不是允许控制器直接为组件设置侦听器,它会通知控制器它可能想知道的视图更改,反之亦然。

这样想。您可能有一个登录控制器和视图,但控制器只关心从视图获取凭据并在视图发出请求时对其进行身份验证,它并不关心从视图角度如何发出该请求。这允许您针对不同的情况设计不同的视图,但只要您保持视图和控制器之间的合同,它不会有任何区别......但这只是我。

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多