在Java MVC模式中,我应该在哪里调用swingworker
我有一个程序,基本上就像这个MVC示例中的程序一样: 在我的程序中,有一个过程需要花费相当多的时间,这会冻结我的GUI。我希望GUI在进程运行时不断更新。要做到这一点,我相信我需要一个SwingWorker。我不知道在我的MVC模式中我应该在哪里调用这个SwingWorker 我的想法是,我应该在控制器的MultiplyListener actionlistener中运行它。这是正确的吗 在这种情况下,模型是一种数学运算,可能通过迭代随着时间的推移而演变。显然,工人属于模型,如图所示。在Java MVC模式中,我应该在哪里调用swingworker,java,swing,model-view-controller,swingworker,Java,Swing,Model View Controller,Swingworker,我有一个程序,基本上就像这个MVC示例中的程序一样: 在我的程序中,有一个过程需要花费相当多的时间,这会冻结我的GUI。我希望GUI在进程运行时不断更新。要做到这一点,我相信我需要一个SwingWorker。我不知道在我的MVC模式中我应该在哪里调用这个SwingWorker 我的想法是,我应该在控制器的MultiplyListener actionlistener中运行它。这是正确的吗 在这种情况下,模型是一种数学运算,可能通过迭代随着时间的推移而演变。显然,工人属于模型,如图所示。setPr
setProgress()
方法将通知任何PropertyChangeListener
,而process()
可以通知任何其他侦听视图,如图所示
附录:在第二个示例中,工作人员更新了一个不同的模型:名为collection
的图表数据集。反过来,图表会侦听数据集并根据更改进行自我更新
在中,控制器代表模型和视图安装操作侦听器。在这种情况下,GUI操作侦听器是其各自视图的本地对象。无论哪种情况,都是封装的合适选择。当模型的内部状态因用户发起的操作而发生变化时,模型会通知其观察者。在这种情况下,模型是一种数学运算,可能通过迭代随时间演化。显然,工人属于模型,如图所示。setProgress()
方法将通知任何PropertyChangeListener
,而process()
可以通知任何其他侦听视图,如图所示
附录:在第二个示例中,工作人员更新了一个不同的模型:名为collection
的图表数据集。反过来,图表会侦听数据集并根据更改进行自我更新
在中,控制器代表模型和视图安装操作侦听器。在这种情况下,GUI操作侦听器是其各自视图的本地对象。无论哪种情况,都是封装的合适选择。当模型的内部状态因用户发起的操作而改变时,模型会通知其观察者。我认为您的
SwingWorker
属于控件,我会告诉您原因。我觉得这个模型应该尽可能地不依赖视图,并且在创建时应该考虑到它可以与不同的视图和控件一起使用,如果需要的话,甚至可以与完全不同的GUI库一起使用。例如,您当前希望在Swing GUI中使用该模型,但如果以后您希望在Android应用程序中使用该模型,该怎么办?为了使它能够在尽可能少的修改下使用,大多数特定于Swing的代码(例如SwingWorker
)应该驻留在控件或视图中
例如,请检查。我认为您的
SwingWorker
属于控件,我会告诉您原因。我觉得这个模型应该尽可能地不依赖视图,并且在创建时应该考虑到它可以与不同的视图和控件一起使用,如果需要的话,甚至可以与完全不同的GUI库一起使用。例如,您当前希望在Swing GUI中使用该模型,但如果以后您希望在Android应用程序中使用该模型,该怎么办?为了使它能够在尽可能少的修改下使用,大多数特定于Swing的代码(例如SwingWorker
)应该驻留在控件或视图中
例如,请查看。afaics,该链接没有描述MVC:它缺少了模型通知更改的责任——或者我缺少了什么?@kleopatra:评论不错;我试着在下面详细说明。afaics,这个链接并没有描述MVC:它缺少了模型通知变更的责任——或者我缺少了什么?@kleopatra:评论不错;我试着在下面详细阐述一下。Swing看起来更传统,而Swing更以模型为中心。从概念上讲,我认为用户是GUI控制器,它看起来更传统,而Swing更以模型为中心。从概念上讲,我认为用户是GUI控制器,我同意模型应该尽可能不依赖视图。但是我很好奇——如果长时间运行的进程不是专门的
SwingWorker
,而是从线程继承的,那么您是否也会提供同样的建议,使用控制器来封装该进程?我的理解是,SwingWorker
是一个与Swing
紧密集成的便利类。相反,如果他自己构建这样一个结构,它与 Swing 不太紧密地结合在一起,他可能会考虑把它存储在别处(模型),对吗?我同意模型应该尽可能不被视为不可知论。但是我很好奇——如果长时间运行的进程不是专门的SwingWorker
,而是从线程继承的,那么您是否也会提供同样的建议,使用控制器来封装该进程?我的理解是,SwingWorker
是一个与Swing
紧密集成的便利类。如果他自己构建这样一个结构,它与 Swing 没有特别紧密的结合,他可能会考虑把它存储在别处(模型),对吧?