Алгоритмы поиска (DFS, BFS, звезда и т. Д.). Как обновить графический интерфейс (с обновленным состоянием) без «зависания»? - PullRequest
1 голос
/ 26 марта 2012

Мой вопрос довольно прост.

Предположим, я выполняю алгоритм "Звезда" (алгоритм поиска, использующий эвристическую функцию для вычисления следующего состояния для посещения).

Я хочучтобы показать в сетке обновления (я буду применять это к задаче с 8 головоломками).Как мне это сделать?Я хочу, чтобы изменения были четко видны ... но по моему опыту, если я просто сделаю что-то вроде Grid[6].showValue(newValue), графический интерфейс будет просто "в режиме ожидания".

Я уверен, что это можно сделать с многопоточностью(может быть?), но есть ли более простой способ?

И еще один очень простой вопрос, если это возможно: мне интересно, есть ли в Java (моя IDE Netbeans) какой-нибудь класс, содержащий методы для поиска, такие как BFS, DFS иЗвезда?Если да, не могли бы вы предоставить ссылку на код алгоритмов (мне нужно использовать их в качестве основы для моего кода ... Я не могу включить их напрямую ... вы знаете ... назначение в университет).Я полагаю, этот код легко найти, поскольку Java является языком с открытым исходным кодом.Я не прав?

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Не выполняйте обработку в потоке GUI.

Если мы говорим здесь о , то это поток обработки событий;используйте рабочие потоки, как описано в руководстве Concurrency in Swing .

1 голос
/ 27 марта 2012

Вы должны выполнить обработку в отдельном потоке, как предложено MДΓΓ БДLL. По сути, вам придется реализовать свой связанный с поиском код в классе, который реализует Runnable, который «помечает» класс как исполняемый в потоке.

Для этого вы можете использовать SwingWorker:

SwingWorker<Integer[], Void> worker = new SwingWorker<Integer[], Void>() {
    public Integer[] doInBackground() {
        //do the computation here. This will be executed in a different thread; 
        //thus allowing the event dispatch thread (=GUI thread) to ensure responsiveness of the UI.
        //NEVER update your GUI here since this could cause strange errors that are sometimes hard to track down.
    }
    public void done() {
        try {
            Integer[] result = get(); //this is executed in the GUI thread after 
            //execution if the doInBackground method finished and fetches the result of 
            //that method. You should update your GUI here.
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
   }
}

Ваш второй ответ: довольно сложно реализовать алгоритм таким универсальным образом, чтобы его можно было использовать для разных типов данных, особенно потому, что дерево, которое вы используете BFS, DFS и A-Star, может содержать данные любого типа. Я думаю, что вы должны найти алгоритмы в псевдокоде в учебнике или лекциях; если нет, найдите его где-нибудь и попробуйте реализовать самостоятельно.

...