Пользовательский интерфейс и фоновый поток в JavaFX. визуализация пузырьковой сортировки - PullRequest
0 голосов
/ 28 января 2020

Это код визуализации алгоритма сортировки пузырьков. Я хочу поменять местами прямоугольники. Однако я не смог этого сделать. Когда я запускаю программу, она ждет немного, максимум 2 секунды, затем все прямоугольники движутся, и это длится 1 секунду или что-то еще. Я думаю, проблема в том, что мне делать?

public void bubbleSort(Rectangle[] rectangles) throws InterruptedException {
        int pass = 1;
            for(int j = 0; j < rectangles.length-1; j++) {
                for (int i = 0; i < rectangles.length - 1-j; i++) {
                    int pos = i;
                    if (rectangles[i].getHeight() > rectangles[i + 1].getHeight()) {

                        Runnable task = new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    System.out.println("opıjapısdjapsoıdj");
                                    Platform.runLater(new Runnable() {
                                        @Override
                                        public void run() {
                                            createAnimation(pos, pos + 1);
                                            System.out.println("xxxxxxx");
                                        }
                                    });
                                    Thread.sleep(2000);
                                } catch (InterruptedException exception) {
                                    // nothing
                                }
                            }
                        };
                        new Thread(task).start();

                        Rectangle temp = rectangles[i];
                        rectangles[i] = rectangles[i + 1];
                        rectangles[i + 1] = temp;
                    }
                }
            }
    }

1 Ответ

1 голос
/ 28 января 2020

Длинный работающий код никогда не следует помещать в поток приложений JavaFX, так как это приведет к зависанию GUI и перестанет отвечать на запросы.

В простых ситуациях вы можете использовать:

Executors.newSingleThreadExecutor().execute(() -> doComputation());

чтобы опубликовать работу в другой ветке и:

Platform.runLater(() -> updateDisplay());

чтобы опубликовать обновление GUI в ветке приложения.

Однако, более рекомендуемое решение - использовать Service.

Этот класс можно расширить и предоставить метод createTask(), который затем можно асинхронно вызывать и прослушивать ответы.

Например:

public class SortService extends Service<int[]> {

    private int[] array;

    public void sortArray(int[] array) {
        this.array = array;
        restart();  // restart() restarts the service regardless of its status
    }

    @Override
    public Task<int[]> createTask() {
        return new Task<int[]> {
            @Override
            protected int[] call() throws Exception {
                // do your sorting and then return the result
                return sortedArray;
            }

        }
    }
}

После настройки этого класса вы можете создать экземпляр, установить массив и прослушать результаты.

SortService service = new SortService();
service.valueProperty().addListener((obs, oldValue, newValue) -> {
    // run on JavaFX Application Thread, safe to update GUI

    System.out.println("Hello from JavaFX Application Thread");
    System.out.println(Arrays.toString(newValue));  
// newValue is our sorted int[] (it is the value you return in your service's createTask())
});
service.sortArray(Arrays.asList(1, 2, 5, 4, 3));  // launch the service

Если вы хотите изменить значение во время работы вашего Service, прежде чем вернуться, вы можете позвонить updateValue(newValue) (возможно, вы хотите отобразить каждый этап сортировки, а не только конечный результат).

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