- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发将具有多个子系统的java swing应用程序。出于所有目的和目的,让我们假设我正在制作一个具有随机附加功能的Internet聊天程序。该功能将是一个日程安排程序,您可以在其中设置时间并获得提醒,还可以通知朋友列表中的每个人您都得到了提醒。
将此功能分为三类是有意义的:GUI,ChatManager和Scheduler。这些类将执行以下操作:
GUI-定义所有摆动组件和事件
ChatManager-创建聊天连接,发送和接收消息,管理好友列表
计划程序-监视系统时间,发送通知,存储文件以记住会话之间的事件
为了使程序正常运行,每个类都必须能够与其他两个类进行通信。 GUI需要告诉ChatManager何时发送消息,并告诉Scheduler何时开始监视。当收到消息时,ChatManager需要在GUI上显示消息,最后,调度程序需要在完成时通知GUI,并将状态更新或任何内容发送给ChatManager。
当然,这里描述的类都非常简单,让它们直接相互通信可能不是一个坏主意。但是,出于这个问题的考虑,让我们假设交互要复杂得多。
例如,假设我们可以向调度程序注册特定事件,而不是特定时间。发送消息时,我去了将其发送给用户,将其存储在日志文件中,创建了一个事件对象,并将其传递给调度程序,并处理了过程中可能引发的任何异常。
当通信变得如此复杂时,如果可以在许多不同的地方与这些类进行通信,则很难维护您的代码。例如,如果要重构ChatManager,则可能还需要对GUI和Scheduler进行重大更改(如果引入新内容,还需要进行其他更改)。这使代码难以维护,并使我们睡眠不足的程序员在进行更改时更有可能引入错误。
最初似乎最有意义的解决方案是使用调解器设计模式。这个想法是,这三个主要类中没有一个直接知道彼此,而是每个都知道一个中介者类。中介类又定义了处理这三个类之间通信的方法。因此,例如,GUI将调用中介者类中的sendMessage()方法,而中介者将处理一切需要发生的事情。最终,这使三个主要类别脱钩,对其中一个类别的任何更改都可能只会导致调解者的更改。
但是,这带来了两个主要问题,最终导致我来这里寻求反馈。它们如下:
问题
许多任务将需要更新GUI,但是介体不知道这些组件。 -假设用户启动该程序并输入其用户名/密码,然后单击“登录”以登录到聊天服务器。登录时,您想通过在登录屏幕上显示文本来报告登录过程,例如“正在连接...”,“正在登录...”或“错误”。如果在Mediator类中定义了登录方法,则显示这些通知的唯一方法是在GUI类中创建一个公共方法来更新正确的JLabel。最终,GUI类将需要大量方法来更新其组件,例如显示来自特定用户的消息,在用户登录/注销时更新您的朋友列表等。此外,您还必须期望这些GUI更新可以随时随机发生。这样可以吗?
Swing事件调度线程。您通常会从组件ActionListeners调用中介方法,该方法在EDT上执行。但是,您不想在EDT上发送消息或读取/写入文件,否则您的GUI将变得无响应。因此,在介体对象中提供一个SingleThreadExecutor是一个好主意,而介体对象中的每个方法都定义了一个新的可运行对象,可以提交给执行者线程?同样,必须在EDT上进行GUI组件的更新,但是Executor线程将调用方法来更新GUI组件。因此,GUI类中的每个公共方法都必须将自己提交给EDT以执行。那有必要吗?
对我来说,在GUI类中有一个方法来更新以某种方式与外部进行通信的每个组件似乎是很多工作,而这些方法中的每一个都具有额外的监听功能,即检查它是否在EDT上,并将其自身添加到EDT中。 EDT否则。此外,Mediator类中的每个公共方法都必须执行类似的操作,将Runnable代码添加到Mediator线程中或启动一个工作线程。
总体而言,使用Mediator模式维护应用程序似乎要比不使用Mediator模式维护应用程序花费更多的工作。因此,在此示例中,您有什么不同(如果有)?
最佳答案
您的GUI类将使用多种方法来保持最新状态,这很好。如果让您担心,则始终可以选择将GUI分解为子GUI,每个子GUI具有不同的功能或少量相关功能。方法的数量显然不会改变,但会更加有条理,连贯和分离。
我建议您尝试其他解决方案,而不是在GUI中创建每种方法,然后使用SwingUtilities.invokeLater将该更新放入EDT。对于我的个人项目,我使用Swing Application Framework(JSR296),它具有一些方便的Task类用于启动后台作业,然后成功方法自动在EDT线程上。如果您不能使用它,则应尝试为后台作业创建自己的类似框架。
关于java - 用于复杂类交互的Java Swing设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/968619/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!