调用线程中的函数并发布中间结果:如何使用SwingWorker?

时间:2012-04-03 13:57:49

标签: java model-view-controller swingworker strategy-pattern

(问题可能看起来很像很长,但我只能看“我需要做什么”,看看我的问题是什么)

我有一个使用策略和MVC模式的应用程序。

  • GUI(VIEW)是:Main.java。它有一组文本框作为输入。还有一个按钮可以调用另一个类中的函数(toStrategy())(Controller.java)

  • Controller.java是MVC模式的CONTROLLER类。它有一个函数调用MainClass.java中的函数callSearchFunction()(这是用“import”导入的另一个包(CONTEXT)的类。)

  • MODEL围绕包CONTEXT的两个类(NodesList和Node)构建(但这只是一个实现细节)。

[实现细节,这不是我的问题] CONTEXT包的MainClass.java是Strategy模式的“主类”。此类在另一个类(SearchContext)上调用两个方法(setAlgorithm和applyAlgorithm),并且此类创建具体策略(创建特定类SearchMethodX(x =搜索算法的名称)的实例,该实现实现包含abstarct方法搜索的接口SearchInterface ())

所以,摘要:

  • Package Main(默认包):

    • class Main.java(GUI - VIEW) - >在Context.java中调用函数toStrategy()
    • class Context.java(CONTROLLER) - >在类MainClass.java(CONTEXT包)中调用callSearchFunction()
    • 辅助班..
  • 包上下文(实现策略模式的包)

    • MainClass.java包含方法callSearchFunction(),该方法根据用户选择的搜索功能实现策略模式创建具体策略
    • Nodes.java和NodesList.java:用于MVC的STATE
    • 辅助班

最后,在callSearchFunctions实例化的类中调用的函数(SearchMethodX.java类中的search())返回一个ArrayList。 函数search()也使用两个ArrayList(命名为:Open,Closed)。

所以调用排序(抱歉很长的解释!)是(syntaxis:Package.class.function()): Main.Main on按钮按下调用Main.Controller.toStrategy() - > Context.MainClass.callSearchFuncton() - > Context.SearchContext.setAlgorithm()然后applyAlgorithm() - > Context.SearchMethodX.search()

我需要做什么: 我需要调用(从Main.Main开始)Context.SearchMethodX.search()。这将返回一个ArrayList并将使用两个auxilairy ArrayList(Open,Closed)并将修改Node和NodesList的实例(这是一个单例类,因此只有一个实例)。

  • 每次更新Node,Open,Closed时,我都要在Main.Main中打印它们。
  • 当算法终止时将返回一个ArrayList,我将打开一个新表单,用户可以在结果之间导航。

我知道/想到解决这个问题的是:

  • search()每次都有更新Node,Open和Closed将创建一个类PartialResult的instane(这个类将包含两个ArrayList + Node,最终会有更多的变量和函数)。
  • 每个SearchMethodX实现一个接口(根据策略模式)并实现java.swing.SwingWorker。
  • PartialResult类将使用publish()“发布”,结果将返回并最终显示在Main.Main

我的疑惑/问题是:

1)看起来应该像SearchMethodX? 我想会是这样的:

  public void SearchMethodX implements SearchInterface,SwingWorker<ArrayList<Node>,PartialResult>{
  // ArrayList = return value , PartialResult = class containing partial results
    ArrayList<Node> search(){
       // publish partially results and returns final result
     }
     // other methods/variables
}

但是我应该把doInBackground()和done()方法放在哪里(根据java文档:http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.htmlhttp://docs.oracle.com/javase/tutorial/uiswing/concurrency/simple.html覆盖SwingWorker抽象方法)? 在哪里编写publish()和get()方法?

2)我应该如何“追溯”部分结果? (我的意思是:将PartialResult实例从search()方法传递给GUI,最后使用PartialResult类的getter打印结果)

当然,任何关于如何编辑策略/ MVC /多线程Swing的建议都被接受了。 我希望我的问题很明确。

提前感谢您的任何提示。

0 个答案:

没有答案