Вызов функции в потоке и публикация промежуточных результатов: как это сделать с помощью SwingWorker? - PullRequest
0 голосов
/ 03 апреля 2012

(ВОПРОС МОЖЕТ СМОТРЕТЬ, КАК ДОЛГО ДОСТАТОЧНО, НО ПОЖАЛУЙСТА, ПРОСТО СМОТРИТЕ «ЧТО МНЕ НУЖНО СДЕЛАТЬ», чтобы узнать мой вопрос)

У меня есть приложение, использующее стратегию и шаблон MVC.

  • Графический интерфейс (ПРОСМОТР): Main.java.Он имеет набор текстовых полей в качестве входных данных.Также есть кнопка, которая вызывает функцию (toStrategy ()) в другом классе (Controller.java)

  • Controller.java - это класс CONTROLLER шаблона MVC.У него есть функция, вызывающая функцию callSearchFunction () в MainClass.java (это класс другого пакета (CONTEXT), импортированный с «import»).

  • МОДЕЛЬ построена вокруг двух классов(NodesList и Node) пакета CONTEXT (но это всего лишь подробности реализации).

[подробности реализации, это не мой вопрос] MainClass.java пакета CONTEXT является "Основной класс »Стратегии выкройки.Этот класс вызывает два метода (setAlgorithm и applyAlgorithm) для другого класса (SearchContext), и этот класс создает конкретную стратегию (создает экземпляр определенного класса SearchMethodX (x = имя алгоритма поиска), который реализует интерфейс SearchInterface, содержащий поиск метода abstarct())

Итак, сводка:

  • Основной пакет (пакет по умолчанию):

    • класс Main.java (GUI - VIEW)-> вызывает функцию toStrategy () в Context.java
    • класс Context.java (CONTROLLER) -> вызывает callSearchFunction () в классе MainClass.java (из пакета CONTEXT)
    • вспомогательные классы..
  • Контекст пакета (пакет, реализующий шаблон Стратегии) ​​

    • MainClass.java содержит метод callSearchFunction (), который реализует шаблон стратегии, создавая конкретные стратегиисогласно выбранной пользователем функции поиска
    • Nodes.java и NodesList.java: используется для СОСТОЯНИЯ MVC
    • вспомогательные классы

Наконец, функция (search () в классе SearchMethodX.java), вызываемая в классе, созданном с помощью callSearchFunctions, возвращает ArrayList.Функция search () также использует два ArrayList (с именем: Open, Closed).

Итак, последовательность вызовов (извините за очень длинное объяснение!) Имеет вид (синтаксис: Package.class.function ()): Main.Main при нажатии кнопки вызывает Main.Controller.toStrategy () -> Context.MainClass.callSearchFuncton () -> Context.SearchContext.setAlgorithm () и затем применяетAlgorithm () -> Context.SearchMethodX.search ()

Что мне нужно сделать: мне нужно вызвать (начиная с Main.Main) Context.SearchMethodX.search ().Это вернет ArrayList и будет использовать два вспомогательных ArrayList (Open, Closed) и изменит экземпляр Node и NodesList (который является одноэлементным классом, поэтому всего один экземпляр).

  • Каждый раз, когда NodeОткрыто, Закрыто обновлено. Я должен напечатать их в Main.Main.
  • Когда алгоритм завершит работу, вернет ArrayList, и я открою новую форму, где пользователь сможет перемещаться между результатами.

Что я знаю / думал для решения этой проблемы:

  • search () каждый раз, когда обновляется Node, Open и Closed создадут экземпляр класса PartialResult (thisкласс будет содержать два 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.html и http://docs.oracle.com/javase/tutorial/uiswing/concurrency/simple.html переопределяют SwingWorkerабстрактные методы)?А куда писать методы publish () и get ()?

2) Как я должен "отслеживать" частично результаты? (Я имею в виду: передать экземпляр PartialResult из метода search () в графический интерфейс и, наконец, вывести результат с использованием методов получения класса PartialResult)

Конечно, любое предложение о том, как редактировать Стратегию / MVC / многопоточное Swing, принимается. Я надеюсь, что мой вопрос ясен.

Заранее благодарю за любую подсказку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...