Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在线程内调用函数并发布中间结果:如何使用SwingWorker调用它?_Java_Model View Controller_Swingworker_Strategy Pattern - Fatal编程技术网

Java 在线程内调用函数并发布中间结果:如何使用SwingWorker调用它?

Java 在线程内调用函数并发布中间结果:如何使用SwingWorker调用它?,java,model-view-controller,swingworker,strategy-pattern,Java,Model View Controller,Swingworker,Strategy Pattern,(这个问题可能看起来很长,但请看一下“我需要做什么”,看看我的问题是什么) 我有一个使用策略和MVC模式的应用程序 GUI(视图)是:Main.java。它有一组文本框作为输入。还有一个按钮可以调用另一个类(Controller.java)中的函数(toStrategy()) java是MVC模式的控制器类。它有一个函数调用MainClass.java中的函数callSearchFunction()(这是使用“import”导入的另一个包(上下文)的类) 该模型是围绕包上下文的两个类(Node

(这个问题可能看起来很长,但请看一下“我需要做什么”,看看我的问题是什么)

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

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

  • java是MVC模式的控制器类。它有一个函数调用MainClass.java中的函数callSearchFunction()(这是使用“import”导入的另一个包(上下文)的类)

  • 该模型是围绕包上下文的两个类(NodesList和Node)构建的(但这只是一个实现细节)

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

因此,总结:

  • 主程序包(默认程序包):

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

    • MainClass.java包含callSearchFunction()方法,该方法实现策略模式,根据用户选择的搜索函数创建具体的策略
    • Nodes.java和NodesList.java:用于MVC的状态
    • 辅助班
最后,在callSearchFunctions实例化的类中调用的函数(SearchMethodX.java类中的search()返回ArrayList。 函数search()还使用两个ArrayList(名为:Open,Closed)

因此,调用排序(抱歉解释得太长!)是(syntaxis:Package.class.function()): 按钮上的Main.Main调用Main.Controller.toStrategy()-->Context.MainClass.callSearchFunction()-->Context.SearchContext.setAlgorithm(),然后调用applyAlgorithm()-->Context.SearchMethodX.search()

我需要做的是: 我需要调用(从Main.Main开始)Context.SearchMethodX.search()。这将返回一个ArrayList,并将使用两个辅助ArrayList(打开、关闭),并将修改Node和NodeList的一个实例(这是一个单例类,所以只有一个实例)

  • 每次更新节点“打开”和“关闭”时,我都必须在Main.Main中打印它们
  • 当算法终止时,将返回一个ArrayList,我将打开一个新表单,用户可以在其中在结果之间导航
我所知道/想到的解决这个问题的方法是:

  • search()每次有更新节点时,Open和Closed都会创建一个类PartialResult的实例(该类将包含两个ArrayList+节点,并最终包含更多变量和函数)
  • 每个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
}
public void SearchMethodX实现SearchInterface、SwingWorker和override SwingWorker抽象方法)?
在哪里编写publish()和get()方法

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

当然,任何关于如何编辑Strategy/MVC/多线程Swing的建议都是可以接受的。。 我希望我的问题是清楚的


提前感谢您的任何提示。

我对您的建议发表了评论,但您没有回应。你看过我给你链接的那个例子了吗?我建议你尝试“分而治之”。试着一次解决一个问题,首先让一个简单的SwingWorker工作,然后从那里开始构建它。@Jim我看到了你的评论,并根据你的评论,我继续工作。我不明白你说的“分而治之”是什么意思。我知道那是什么,但我不明白如何(以及为什么?)在这里申请以获得结果我想知道英语可能不是你的第一语言。我尊敬的是,你不仅英语学得相当好,而且还学会了编程。美好的但你需要保持对话。我所说的“分而治之”是指你需要把你的问题分解成尽可能小的部分,然后逐一解决。当你遇到一个特定的问题时,建立一个完整的代码示例,并在这里发布一个特定的问题。当你做到这一点时,你会发现人们会更好地帮助你。我在另一个问题中给出的链接会有所帮助。我的英语这么差吗?也许是因为我是意大利人,我在学西班牙语……:)然而我知道“分而治之”是如何运作的,但我不明白在这种情况下我为什么要这样做