Я работаю над школьным проектом, который включает в себя создание двух отдельных объектов Swing Canvas, которые оживляют алгоритмы поиска ширины/глубины и первого порядка на клонированных копиях структуры данных матрицы/сетки, которые я разработал.Java-потоки не работают на отдельных объектах
Я создал несколько классов, которые помогают преобразовать матрицу/сетку в графику, которые объединены в классе SearchAnimation, который действует как ViewController для управления анимацией. На изображении ниже они отображаются справа (не в области желтого фона). Каждый объект SearchAnimation включает в себя JLabel, Canvas и White Background.
Ниже приведен скриншот макета:
фрейму содержит два экземпляра класса SearchAnimation в контроллере класса Application (ICL.java). Эти анимации должны выполняться одновременно. Я создал отдельные темы для каждой анимации, передавая ему отдельные объекты SearchAnimation:
public void setupDepthFirstPanel() {
// Create a new GridGraphic Panel
//canvasDepthFirst = new GridPanel(null, DEPTH_FIRST_LABEL);
mDepthAnimation = new SearchAnimation(null, SearchAnimationType.DEPTH_FIRST_ANIMATION);
mDepthThread = new Thread(mDepthAnimation, "Depth Thread");
}
public void setupBreadthFirstPanel() {
// Create a new GridGraphic Panel
//canvasBreadthFirst = new GridPanel(null, BREADTH_FIRST_LABEL);
mBreadthAnimation = new SearchAnimation(null, SearchAnimationType.BREADTH_FIRST_ANIMATION);
mBreadthThread = new Thread(mBreadthAnimation, "Breadth Thread");
}
я начинаю темы в классе ActionListener, который реагирует на событие нажатия кнопки, что с надписью «Этикетка Components»:
if (source == labelComponents) {
if (DEBUG && DEBUG_CLICK_LISTENER) System.out.println("\"Label Components\" Button Clicked!");
/*This is where the call for the labelBreadth and labelDepth of the
ICLLogic class is going to occur*/
// Run Animation
// Set Up Threads
System.out.println("ICL.ActionPerformed - Current Thread: " + Thread.currentThread());
//mBreadthThread = new Thread(mBreadthAnimation, "Breadth Animation");
//mDepthThread = new Thread(mDepthAnimation, "Depth Animation");
// Start Threads
mBreadthThread.start();
mDepthThread.start();
}
Когда программа запускается и нажимается кнопка «Компоненты ярлыков», только одна из графических объектов начинает анимацию, но кажется, что оба потока SearchAnimation работают в пределах одного JPanel/Canvas, поскольку анимация не соответствует логике либо алгоритм.
Вот реализация Runnable интерфейса в SearchAnimation:
// THREAD METHODS
/** Implementation of the Runnable interface for Multithreading of the
* SearchAnimation Class, which allows multiple SearchAnimations to run Concurrently.
* In this case, the Breadth & Depth-First SearchAnimations
*
*/
public void run() {
System.out.println("Thread Started - " + mAnimationType.toString());
// Run the Animation
step();
}
который в конечном итоге вызывает determineSearchType(), который переключается на Enum, чтобы выбрать подходящий алгоритм:
public void determineSearchType(Pixel p) {
// Animate a single pixel movement, step depends on AnimationType
if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Determining Animation Type..."); }
switch (mAnimationType) {
case BREADTH_FIRST_ANIMATION:
if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Animation Type: Breadth-First"); }
// Begin Breadth-First Search
stepBreadthSearch(p);
break;
case DEPTH_FIRST_ANIMATION:
if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Animation Type: Depth-First"); }
// Begin Depth-First Search
stepDepthSearch(p);
//simpleDepthSearch(mCurrentPixel);
break;
}
}
Когда я чередовать комментирования их нить/анимация выполняется на собственной графике JPanel/Canvas и дает ожидаемые результаты. Я довольно новичок в потоковом режиме, и я уверен, что у кого-то есть простое решение. Любые идеи о том, как я могу решить проблему, которую анимация не будет анимировать одновременно?
К сожалению, качели абсолютно ** не ** потолочные. Вы ** абсолютно ** не можете получить доступ к объектам Swing из нескольких потоков. Это ** будет результатом непредсказуемого поведения. Все и любые взаимодействия с объектами Swing ** должны происходить на EDT. –
Даже если они являются отдельными экземплярами, которые имеют отдельные ссылки и значения свойств? Класс расширяет эти объекты качания. – Matt
Не имеет значения. Качание должно происходить на EDT. Полная остановка.Для выполнения фоновых задач вам необходимо использовать [Swing workers] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html). –