【问题标题】:Swing programming - how to pass UI componentsSwing编程——如何传递UI组件
【发布时间】:2012-12-04 16:55:41
【问题描述】:

我试图了解 UI 组件应如何在 Java 中连接。就常规的“服务器”类而言,我正在尝试使用接口并使用 Spring 注入所有内容。如果是 UI,是否应该使用类似的方法?

更准确地说,让我们考虑以下几点:

class Panel1 extends JPanel{

    public Panel1(Service service, DBConnector db);
}

class Panel2 extends JPanel{

    public Panel1(Delegate delegate, Executor exec);
}

class MainFrame{

    public MainFrame(Service service, DBConnector db, Delegate delegate, Executor exec){
        Panel1 p = new Panel1(service, db);
        Panel1 p = new Panel1(delegate, exec);
    }
}

class MainFrame{

    public MainFrame(Panel1 panel1, Panel2 panel2){
    }
}

我只是想大致了解一下什么在 UI 世界中更合适,如果它与常规类完全不同(可能是因为主框架中可能涉及许多面板)

【问题讨论】:

  • 使用构造函数是传递引用的一种方式。但我个人会避免混合图层。一种方法是拥有一个控制器类(MVC 的一部分)并将其与底层服务和数据库层的引用联系起来。顺便说一句,代表是做什么的?
  • 顺便说一句,您在 Swing 中成功调用 Spring 的应用程序上下文了吗?因为到目前为止,我必须通过将引用存储在静态变量中以使其可访问。
  • 这是一个随机示例 - 那么您更喜欢哪种方法?在某些时候,我需要实例化一个包含很多面板的 JFrame,它要么需要将所有需要的参数作为参数,要么采用每个面板,或者采用工厂,但工厂随后必须采用所有服务等。什么是正确的方法:)?
  • 一些 Swing 程序员似乎想出了自己的秘诀。我要做的是类似于在link 上使用调解器策略的 MVC。然后让控制器扮演 UI 和服务层接口之间的中间人。这样可以更好地解耦,并且可以将一个或多个视图(可以是 JPanel)挂接到同一个模型中。
  • 你能举个例子吗,因为我看不到 JPanel 将如何通过中介使用服务

标签: java swing dependency-injection


【解决方案1】:

我还没有看到有人在 UI 中使用 DI;这可能是因为 DI 是一个相当新的概念(与构建 UI 相比),或者大多数人在 UI 地狱中生活了一段时间后逃到了MVC,而 MVC 解决了所有问题。

此外,从某种意义上说,大多数 UI 都是静态的,您可以使用按钮打开和关闭窗口/对话框,但不能用另一个对话框替换一个对话框。这会很方便,但前提是我作为用户/消费者可以做到这一点。编写两个执行相同操作的对话框然后使用 DI 连接其中一个或另一个是没有意义的。您要么需要两个不同的对话框,要么只需要一个。

当 UI 支持扩展时(如 Eclipse),它们使用插件系统在运行时加载 UI 元素,其中的代码发现菜单、工具栏等并添加元素。

e4(Eclipse 的最新代码库)将 DI 用于许多事情,但不用于构建 UI。同样,用户界面通常是静态的,因为您永远不会在用户可以从中选择的特定位置拥有两个或更多服务。

因此使用 DI 可能有意义,但它可能是开创性的工作(即,您必须探索可能性空间并自己找到低复杂度的低谷)。

【讨论】:

  • JHotDraw,引用here,是对 GUI 设计模式的有用研究。
猜你喜欢
  • 2019-12-27
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2021-05-19
  • 2017-07-29
  • 1970-01-01
相关资源
最近更新 更多