有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSwing:保持事件处理的可维护性

在我当前的项目中,我们为Swing客户端使用以下模式:

业务对象(POJO)<--&燃气轮机;(地图绘制)<--&燃气轮机;演示模型(支持属性更改的POJO)<--&燃气轮机;(有约束力)<--&燃气轮机;视图组件

一切都很好,按照我们期望的方式运作

但是,当视图开始增长时,我们会遇到这些问题:

  1. 许多事件被触发,导致级联事件。一个字段的一次更新可能会导致几十次后续的属性更新
  2. 当对话框复杂度增加时,侦听器的数量也会增加,代码开始变得凌乱和难以理解

在第一个答案后编辑:

  • 如果值没有变化,我们不会触发事件
  • 如果不需要侦听器,我们就不会添加它们

我们的屏幕上有非常复杂的规则,需要其他相关小组的通知。因此,我们有很多有用的侦听器,单个用户的更改可以触发许多底层事件

将表示模型与业务模型绑定的想法对我们来说并不太好:我们在映射过程中执行一些代码


我正在寻找关于构建可维护Swing应用程序的指南、建议、最佳实践等,特别是对于事件管理方面


共 (3) 个答案

  1. # 1 楼答案

    有许多方法可以减少发送的事件数

    1. 没有更改时不要传播事件。这个例子的一个典型例子是编写setter触发PropertyChangeEvent(见下文)的惯用方法,但对于手动触发的所有类型的事件都是如此
    
        public void setMyField(Object newValue) {
            Object oldValue = myField;
                if((oldValue==null && newValue!=null) || (oldValue!=null && !oldValue.equals(newValue))) {
                    myField = newValue;
                    propertyChangeSupport.firePropertyChange("myField", oldValue, newValue);
                }
            }
        }
    
    1. 仅在您开始感兴趣时注册为事件侦听器,并在您不再感兴趣时取消注册。事实上,作为一个监听器,即使它不用于任何操作,也会迫使JVm调用用于事件传播的各种方法。不做监听器将避免所有这些调用,并使应用程序简单得多

    2. <> >考虑将POJO替换为通过增加POJO的直接初始化来增加POJO映射。或者,简单地说:让您的POJO authentical java bean具有PropertyChangeEvent处理能力。为了使它们易于持久化,一个简单的解决方案是,一旦“重新水化”,或从持久化层加载,添加一个持久化更新程序机制作为PropertyChangeListener。这样,当POJO被更新时,持久层会得到通知,并透明地更新数据库中的对象

    所有这些都是非常简单的建议,只需要大量的讨论,以确保事件只在正确的时间和正确的听众被触发

  2. # 2 楼答案

    我建议每个模型采取单一事件行动。不要尝试将它分解为具有无望的ProtpertyChangeListener的字段。使用ChangeListener或您自己的等效工具。(老实说,事件参数没有帮助。)可能将“属性”类型更改为可侦听对象,而不是侦听复合对象

  3. # 3 楼答案

    大多数Swing组件使用的^{}方案相当轻量级。在决定一个新的体系结构之前,一定要对代码进行概要分析。除了usual choices之外,这个EventQueue子类example还提出了另一种监视事件流量的有趣方法