【问题标题】:Best way to handle JFrame components from outside class从外部类处理 JFrame 组件的最佳方法
【发布时间】:2012-07-08 15:05:02
【问题描述】:

我正在开发一个 Swing 应用程序,它调用多个方法并初始化不同的类。 我也有多个线程来处理中间结果。我的要求是在一些标签和文本框中即时显示中间数据。

请帮我看看以下哪种方法在内存和性能方面最好。

  1. 我可以为所有标签和文本框设置 setter 方法。这样我就可以使用该摇摆类对象调用这些方法,但在这种情况下,我需要将摇摆类对象传递给每个我想将数据设置为标签的类。
  2. 另一种方法是我可以创建我的 swing 类的公共静态对象,并且每当我需要设置标签文本时,我都会从任何类中调用它。

第一种方法会产生更多开销,因为我需要将我的 Swing 类对象传递给其他类。

第二种方法是最简单的方法,但创建静态对象可能会造成混乱,因为此应用程序包含线程。

我只想知道选择哪一个以及为什么?

否则,如果有人从事过一些复杂的 Swing 应用程序开发 - 您是如何处理这些问题的?

【问题讨论】:

  • 忘记你的第二种方法。它很丑。不应该有太多不同的对象需要更新给定的框架或面板。

标签: java multithreading swing jlabel


【解决方案1】:

example 是您在多线程上下文中的第一种方法的典型代表。为方便起见,模型和视图是紧密耦合的:每个工作线程都会接收到它应该更新的标签的引用。另一种方法是松散耦合:每个视图都注册以侦听模型,模型使用observer pattern 通知所有注册的侦听器。

这个更简单的example 使用了这两种方法:

  • 紧耦合:worker 在封闭范围内获得对其目标标签的引用。

  • 松散耦合:封闭视图注册一个PropertyChangeListener,模型使用它通过setProgress()向视图发送信号。

您需要决定在您的应用程序中哪些是重要的。我同意@JB Nizet 关于第二种方法的评论。

【讨论】:

    【解决方案2】:

    为什么不使用Singleton原理的第二个方法,可以使用同一个swing类的单个实例,这样就不用静态了 ,并且它有时会令人困惑,因为我们不确定 JVM 加载静态成员的顺序...

    【讨论】:

    • 你打算如何在不使用静态字段的情况下实现你的单例?
    • 整个类中只有一个静态字段,即实例本身。其他字段根本不需要是静态的。有关详细信息,请参阅 Head First Design Pattern 的 Singleton 章节...
    【解决方案3】:

    将 GUI 视为具有视图的模型。 GUI 组件构成视图,而您创建表示模型的模型类。模型中值的更改会反映在视图中。应用程序的其余部分与模型交互,而不是视图。

    这是我所做的Java Spirograph GUI 中的一个示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多