我总是编写控制台应用程序并使用C ++学习一些基本的UML /模式技能。
现在我决定转向Java并将GUI添加到我的程序中。
第一个问题是如何在程序设计中处理GUI层。我的意思是,我应该如何将所有GUI代码(添加组件,基本事件处理)与真正完成工作的代码(例如,按下某个按钮时)分开。
与EDT有关的另一个问题。我读过(几乎)所有Swing组件必须在同一个线程(通常是EDT)中运行,因为它们不是线程安全的。所以我认为,如果从(例如)ActionListener
调用“重代码”,那么GUI将在一段时间内变得无法响应,直到“重代码”完成。
这是非常不受欢迎的,所以我认为自然的解决方案是在另一个线程中运行繁重的代码或者执行类似的操作(我知道这必须小心谨慎,因为我不能再承认用户之后了单击一个按钮,在处理另一个GUI事件之前完成“深层操作”。)
如您所见,我有很多关于如何在我的模式中包含GUI以保持所有独立且易于维护的问题;关于Swing组件和响应性的特定事项的一些问题。
答案 0 :(得分:3)
将业务逻辑与GUI分开:如果您打算使用Swing,首先要研究Model-View-Controller design pattern。这是关注分离的一个很好的模式,Swing很大程度上依赖它。
重型代码和EDT:使用SwingUtilities,甚至更好,SwingWorkers。
答案 1 :(得分:1)
你会发现Swing已经在很大程度上构建了一个他们称之为view-delegate的MVC变体 您需要做的是决定应用程序逻辑进入GUI层的程度,并且总是存在一些。有一点有用的是,如果gui动作是为了执行一项重要任务 - 例如更新数据库中的某些数据,那么请确保GUI动作处理程序可以调用的简单调用与gui无关。代码/结构。这可以通过在IDE中使用具有单向依赖性的项目来实施。例如,将所有GUI代码保存在“gui”项目中,该项目取决于您的“常见”项目。 “common”项目将能够执行业务逻辑,但不会导入swing小部件,也无法看到你的“gui”项目。
将EDT确定为关键设计问题是件好事 - 因为它确实如此。 LBT已经建议使用SwingWorker,这是在单独的线程上管理长期运行的gui任务的好方法。