【问题标题】:Swing and lazy loading componentsSwing 和延迟加载组件
【发布时间】:2010-08-25 19:45:45
【问题描述】:

我使用了Eclipse 插件Visual Editor 来构建Java Swing 接口。由于我不是所见即所得 (UI) 编辑器生成的代码的忠实粉丝,因此我想对其进行优化,当我注意到编辑器使用延迟加载实现所有元素时,如下所示:

private JPanel getSomePanel ()
{
    if ( somePanel == null )
    {
        somePanel = new JPanel();
        // construct the panel
    }
    return somePanel;
}

我知道延迟加载用于获得更好的性能,当有问题的对象没有立即使用时。然而,对于大多数用户界面来说,这不太有意义,例如,一个窗口通常应该从一开始就显示它上面的所有组件。在我的情况下也是这种情况,我有一个相当简单的清晰布局,在显示窗口时所有组件都应该存在。

Visual Editor 在根容器的构造函数中添加了一个initialize 调用,其中构造了根面板并添加了所有其他元素(通过延迟加载)。所以实际上所有组件都是在构建根容器时就创建的,只是嵌套在多个方法中。

在这种情况下,延迟加载实际上有什么用吗?在哪些 UI 情况下我应该使用延迟加载?当使用延迟加载时,我是否真的可以直接访问成员变量 - 还是应该每次都调用 getter?

谢谢!

【问题讨论】:

    标签: java swing lazy-loading


    【解决方案1】:

    使用延迟加载时,每次访问成员变量时都应始终使用 getter。这是延迟加载的基本部分。

    但是,在您描述的这种情况下,没有理由使用延迟加载。我不得不怀疑,Visual Editor 的作者是否只是有一些延迟加载的东西,他觉得总是需要使用它,或者只是出于某种任意原因决定他想在工具中使用它。

    您对 UI 完全正确,因为在构建面板时组件通常全部加载,因为它们都是可见的。在某些情况下,面板的某些部分可能会根据面板上的其他选择出现和消失,可以想象在这些情况下您可以使用延迟加载。然而,我的观点是,人们很可能会在界面上单击并使用所有不同的选项卡和选项,因此您不妨先加载所有内容。

    显然,当您谈论加载数据时,情况有所不同。如果您有一个在面板出现时隐藏的下拉菜单,并且如果加载了很多信息,您可能希望在它变得可见之前不加载该下拉菜单。不过,我仍然认为没有理由不立即实例化下拉菜单,即使它被隐藏了。

    我根本不认为延迟加载是面板的规范行为。我无法提供 Visual Editor 选择以这种方式生成代码的原因。

    【讨论】:

      【解决方案2】:

      我不是 WYSIWYG 代码的忠实粉丝 (UI) 编辑器生成

      我也是。

      懒惰真的有用吗 在这种情况下加载?

      我不这么认为,组件的创建不需要时间,所以在显示 GUI 时所有组件都应该是可见的。

      对我来说,更关心的是数据。如果您的组合框和表格等组件的数据来自数据库,您可能不想全部加载。

      【讨论】:

      • 你的意思是我应该懒惰地用数据填充元素?我该怎么做呢?
      • 没有。他的意思是,如果您需要从数据库加载数据并使用它来填充表格或下拉列表,您应该让它在单独的线程中运行,这样它就不会在加载时阻塞 EDT。它不适用于任何类型的默认数据,仅适用于需要来自可能需要一些时间才能加载的备用源的数据,并且您不想在加载时阻止 UI。
      • “延迟加载”数据的良好起点可以是 AncestorListener.ancestorAdded 事件。您可以在此处开始在单独的线程上执行长时间运行的数据检索过程。
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多