当前位置: 首页 > 知识库问答 >
问题:

什么被认为是不好的做法?

莫英喆
2023-03-14

我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。

所以首先,我想确认我理解正确。

据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。

有了这些,我的问题是:使用这个的好做法是什么?据我所知,至少有两种方法:

1) 在main方法中,将所有代码(例如GUI创建、控制器创建,甚至模型创建(假设为MVC类型模式))放置在invokeLater方法调用的Runnable中。当然,这是假设模型中任何长时间运行的任务都将由SwingWorker执行。

2) 将GUI创建放在调用器中,但控制器创建和模型创建放在main方法中。然后,无论何时需要从控制器访问Swing组件,都可以在invokeLater方法中弹出所述代码,将其放在EDT队列中。

这两种做法中哪一种被认为是最佳做法,还是糟糕做法?如果这两个都不好,有什么更好的方法来解决这个问题呢?

任何信息都将不胜感激。

谢谢

共有2个答案

西门鹏程
2023-03-14

这的确是一个有趣的问题,而公认的答案并没有完全回应它。

你建议的两种方法都是可以接受的,而且都会很好地工作,但我相信第一种方法比第二种方法更好(在EDT上完成所有任务,如果有一些长期运行的任务,则在SwingWorker上完成,如果与Swing无关,则在新线程上完成)。

为什么?正如@ThomasKrägler在这里指出的:

虽然可以将这些任务(模型、控制器和视图创建)在主线程和EDT之间拆分(在首次显示UI之前可能会增加几毫秒),但这也会使应用程序的设计复杂化(多线程不是一个容易的主题),并用invokeLater()调用浪费代码库。

考虑到EDT不需要处理任何东西,直到模型和控制器初始化(从而启动视图)。因此,您可以使用EDT来初始化它们,因为它不会对您的UI产生任何负面影响(目前还没有UI)。

这样做,您将节省大量invokeLater调用,以及忘记调用invokeLater时可能出现的错误。你的代码看起来也会更干净。

臧兴学
2023-03-14

SwingWorker并不特别,它只是一些常见场景的包装器。它会代表您调用调用,所以实际上您呈现的两个案例只是同一件事的实例。

只要确保你遵守以下两条规则:1。不要拖延EDT 2。在EDT上执行Swing相关代码

 类似资料:
  • 问题内容: 为什么每个人都告诉我编写这样的代码是一种不好的做法? 我省略花括号的最大论据是,有时花括号可能是花括号的两倍。例如,以下代码为C#中的标签绘制发光效果。 您还可以获得链接usings在一起的额外好处,而不必缩进一百万次。 花括号的最常见参数涉及维护编程,以及在原始if语句及其预期结果之间插入代码会引起的问题: 问题: 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,

  • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。

  • 问题内容: 我有一个类的以下代码,它工作正常: 但是,我认为在该方法中实现OnClickListener是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择? 问题答案: 最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述: 很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 问题内容: 编辑:在上面的链接中回答的问题。 不,PHP中的“全局”与其他语言中的“全局”不同,尽管它不引入任何安全性问题,但会使其他人较难理解该代码。 OP: 项目摘要-我正在编写一个Web CMS,以使自己熟悉PHP / MySQL。为了分解代码,我对以下基本层/模块有一个概念: 数据 -MySQL表 -PHP变量 功能 -SQL- 获取/设置/等 -前端-显示页面 -后端-管理器 演示文稿

  • 问题内容: 我正在开发一个网页,在那里我为类似国际象棋的游戏布置一块面板,以及几个棋盘托盘。所有操作都使用HTML(使用jQuery在游戏进行时进行动态更新)完成。在某个地方,我想到在页面中使用元素的绝对定位被认为是不好的做法,并且最好使用相对定位。 经过相对定位的困扰了很长时间之后,我意识到板元件的绝对定位要容易得多,而且要正确得多。 有谁知道相对定位优于绝对定位的原因吗?在决定采用哪种方法时,