Java GUI层vs代码层vs Swing 我总是编码控制台应用程序,并学习了一些基本的UML /模式技巧,使用C++ + < /P>

Java GUI层vs代码层vs Swing 我总是编码控制台应用程序,并学习了一些基本的UML /模式技巧,使用C++ + < /P>,java,swing,user-interface,design-patterns,Java,Swing,User Interface,Design Patterns,现在我决定转向Java并将GUI添加到我的程序中 第一个问题是如何在程序设计中处理GUI层。我的意思是,我应该如何将所有GUI代码(添加组件、基本事件处理)与真正执行任务的代码(例如,当按下某个按钮时)分开 另一个问题与EDT有关。我读到(几乎)所有Swing组件都必须在同一个线程(通常是EDT)中运行,因为它们不是线程安全的。因此我认为,如果从(例如)一个ActionListener调用“重代码”,那么GUI将在一段时间内变得不负责任,直到“重代码”完成 这是非常不受欢迎的,所以我认为自然的解

现在我决定转向Java并将GUI添加到我的程序中

第一个问题是如何在程序设计中处理GUI层。我的意思是,我应该如何将所有GUI代码(添加组件、基本事件处理)与真正执行任务的代码(例如,当按下某个按钮时)分开

另一个问题与EDT有关。我读到(几乎)所有Swing组件都必须在同一个线程(通常是EDT)中运行,因为它们不是线程安全的。因此我认为,如果从(例如)一个
ActionListener
调用“重代码”,那么GUI将在一段时间内变得不负责任,直到“重代码”完成

这是非常不受欢迎的,所以我认为自然的解决方案是在另一个线程中运行繁重的代码,或者做类似的事情(我知道这必须小心完成,因为我不能再假设在用户单击按钮之后,“深层动作”是在处理另一个GUI事件之前完成的)


正如您所看到的,我有很多问题,关于如何在我的模式中包含GUI,以保持所有模式的独立性和易维护性;还有一些关于Swing组件和响应性的问题。

重新将业务逻辑与GUI分离:如果您打算使用Swing,首先要学习。这是一个很好的关注分离模式,Swing严重依赖于它


关于重载代码和EDT:使用,甚至更好。

您会发现Swing已经被大量构造为MVC变体,他们称之为视图委托。
您需要做的是确定有多少应用程序逻辑进入GUI层,并且始终存在一些逻辑。一件有帮助的事情是,如果gui操作是为了执行一项重要的任务,比如更新数据库中的一些数据,那么请确保gui操作处理程序可以调用一个与gui代码/结构无关的简单调用。这可以通过使用IDE中具有单向依赖性的项目来实现。例如,将所有GUI代码保存在依赖于“公共”项目的“GUI”项目中。“公共”项目将能够执行业务逻辑,但不导入swing小部件,也看不到您的“gui”项目

很好,您将EDT确定为一个关键的设计问题,因为它是。LBT已经建议使用SwingWorker,这是一种在单独线程上管理长期运行的gui任务的好方法