【发布时间】:2011-09-20 07:51:23
【问题描述】:
我做了一个基于 GUI 的大型应用程序,现在我有很多 Action 的东西...
我有不同的Listeneres,比如ActionListener,KeyAdapters,...
一切都应该以线程方式运行,因此我的 GUI 在长时间操作时不会冻结。所以我在每个ActionListener 中使用SwingWorker...
目前它的工作方式如下:我有我的JComponents,绑定在一个ActionListener 上。在这个Listener 中,我根据actionCommand() 决定要做什么。我调用了一个方法,其中包含我的SwingWorker 和应该执行的Action。
我不再喜欢这个概念了,因为我的课越来越长,而且我对所有功能没有一个概览。所以我决定换一种方式...
我认为工厂方法会很棒,但这是我的问题:我有时需要来自我的 GUI 的数据,例如:按下JButton x 时,JTextField y 中的内容等等......
那么对此的最佳做法是什么?我应该给我的工厂一个完整的 GUI 实例吗?还是Components 中的ArrayList?另一个问题是需要从我的 GUI 中更改值,例如:按下按钮 x 然后过滤 JTable... 我应该怎么做?
像this = myFactory.process(this); 那样做真的不是我想要的……
【问题讨论】:
-
@reox 我修改了你的帖子,如果不是请回复...
-
@reox,专注于封装。你是对的,使用
SwingWorker处理长时间运行的任务是“最佳实践”的例证,但这不是必需的。还有其他实用程序(例如SwingUtilities)可用于确保在EDT上发布与 Swing 相关的内容,但在单独的线程中发生。也许提供一小段代码可以帮助我们完善我们的答案。 -
@mre:所以我应该使用工厂并且应该封装我所有的字段和东西?
-
考虑扩展 AbstractAction 而不是实现 ActionListener 接口。
-
是的,我有,我有一个自己的 Action 类,其中包含我的 Swing Worker 的东西,所以当我调用方法 .runBackground() 时,它将启动一个新的 Swing Worker,内容为 myAction.process (args) - 所以我走对了?
标签: java swing user-interface awt actionlistener