【问题标题】:Best practise for GUI Components ActionListener?GUI 组件 ActionListener 的最佳实践?
【发布时间】:2011-09-20 07:51:23
【问题描述】:

我做了一个基于 GUI 的大型应用程序,现在我有很多 Action 的东西... 我有不同的Listeneres,比如ActionListenerKeyAdapters,... 一切都应该以线程方式运行,因此我的 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


【解决方案1】:

看看JGoodies Binding:它强调使用PM (PresentationModel) 来存储所有GUI 状态(并绑定到实际的GUI 组件)。

每个 View 都有一个关联的 PM,它与域模型建立链接。 PM 可以在没有 View 的情况下生存(但反之则不然)。

PM 不应有任何与 GUI 相关的依赖项(因此它可以在没有 GUI 的情况下进行单元测试),因此不引用 JTextField、JButton...

但是,PM 通常包括附加到 视图 按钮的Actions。操作不是实际的 GUI 组件(尽管它们属于 javax.swing 包。

我说“通常”是因为一些动作可能需要显示一个消息框,打开一个新窗口......这种动作应该放在另一个类中。请注意,Karsten Lentzsch(JGoodies 的作者)在他的演讲中没有谈论这个案例(这是我自己处理这个案例的方式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2011-03-11
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多