Содержимое холста Javafx исчезает - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь визуализировать процесс решения задачи коммивояжера с помощью алгоритма 2-opt-change, но иногда кажется, что выполнение программы застревает, и окно останавливается безо всякой ошибки. Иногда даже линии, нарисованные на холсте, исчезают.

It shold look like this:

But it looks like this:

Немного помощи было бы неплохо.

Вот код чертежа:

 int numCities = getNumOfCities();
        Order currentOrder = data.getCurrentOrder();
        if (newValue) {
            GraphicsContext gc = canvasCities.getGraphicsContext2D();
            gc.clearRect(0, 0, canvasCities.getWidth(), canvasCities.getHeight());
            gc.setStroke(new Color(0, 0, 0, 1));
            gc.setLineWidth(1);
            gc.setFill((Color.GRAY));
            for (int i = 0; i < currentOrder.getSize(); i++) {
                City current = data.getCities()[currentOrder.getValue(i)];
                City next;
                if ((i + 1) > numCities - 1) {
                    next = data.getCities()[currentOrder.getValue(0)];
                } else {
                    next = data.getCities()[currentOrder.getValue(i + 1)];
                }



                gc.fillOval(current.getX() - 5, current.getY() - 5, 10, 10);
                gc.strokeLine(current.getX(), current.getY(), next.getX(), next.getY());

            }

            if(!(data.getBestEver()==null)) {
                Order best = data.getBestEver();
                gc.setStroke(new Color(1, 0, 0, 1));
                gc.setLineWidth(3);
                gc.setFill((Color.GRAY));
                for (int i = 0; i < best.getSize(); i++) {
                    City current = data.getCities()[best.getValue(i)];
                    City next;
                    if ((i + 1) > numCities - 1) {
                        next = data.getCities()[best.getValue(0)];
                    } else {
                        next = data.getCities()[best.getValue(i + 1)];
                    }


                    gc.fillOval(current.getX() - 5, current.getY() - 5, 10, 10);
                    gc.strokeLine(current.getX(), current.getY(), next.getX(), next.getY());

                }
            }
            repaint.set(false); //boolean that indicated if something changed and a repaint is necessairy
        }

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Проблема была в многопоточности. После преобразования части краски в работающий объект, который был вызван с помощью Platform.runLater(), он работает нормально.

Спасибо всем, кто уделил время размышлениям о моей проблеме.

0 голосов
/ 02 мая 2018

но иногда кажется, что выполнение программы застревает и окно зависает без ошибок.

JFX потребляет много ресурсов ... особенно с Canvas и Shapes (например, рекурсивная группа и т. Д.). Если он застрял, это может означать, что "стек" был на грани переполнения. Попробуйте с -Xss [nnM], где nn - любое число, M - мегабайт. Пример -Xss16M: стек с 16 МБ для потоков JFX. Если он по-прежнему ведет себя "странно", тогда объедините -Xss с -Xms (для кучи).

...