Графический контекст не отображает фигуры / не отображается

При выполнении следующего кода создается просто пустое окно, так как не отображаются видимые круги. Ожидается, что на окне появятся случайно расположенные черные кружки.

Вот мой код:

package circles;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import java.util.Random;
import javafx.scene.paint.Color;

public class Circles extends Application {

    private Canvas canvas = new Canvas(400, 400);

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox();
        root.getChildren().add(canvas);

        Scene scene = new Scene(root);

        primaryStage.setTitle("Draw Circles");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void drawCircles() {
        // radius of the circles
        final int RADIUS = 20;
        Random rand = new Random();
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
        gc.setFill(Color.WHITESMOKE);
        for (int i =0; i <50;i++) {
            int x = rand.nextInt(400);
            int y = rand.nextInt(400);
            gc.fillOval(x,  y, RADIUS, RADIUS);
        }
    }

    public static void main(String[] args) {
     Circles x = new Circles();
     x.drawCircles();
     launch(args);
  }
}

Где вы называете свой метод drawCircles()?

Lutzi 23.04.2018 16:47

Извините, я понял, что загрузил не ту версию, даже с этим изменением она по-прежнему не работает (см. Выше).

czedarts 23.04.2018 16:57

Вы вызываете drawCircles() для объекта, отличного от того, который используется для создания пользовательского интерфейса (т.е. вызывается объект, отличный от start()). Просто позвоните drawCircles() прямо с start().

James_D 23.04.2018 17:02

Спасибо :), извините, теперь это так очевидно

czedarts 23.04.2018 17:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
532
1

Ответы 1

Метод Application.launch(...) создает экземпляр класса приложения и (после некоторой другой работы) вызывает для него start().

В коде вы сначала создаете экземпляр класса вашего приложения Circles, вызываете для него drawCircles(), а затем вызываете Application.launch(...). Это вызывает создание второго экземпляра Circles и вызов start() на этом втором экземпляре.

Следовательно, drawCircles() не вызывается для того же объекта, что и start(), и поэтому круги рисуются на холсте, который никогда не отображается.

Просто переместите вызов drawCircles() в метод start():

package circles;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import java.util.Random;
import javafx.scene.paint.Color;

public class Circles extends Application {

    private Canvas canvas = new Canvas(400, 400);

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox();
        root.getChildren().add(canvas);

        drawCircles();

        Scene scene = new Scene(root);

        primaryStage.setTitle("Draw Circles");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void drawCircles() {
        // radius of the circles
        final int RADIUS = 20;
        Random rand = new Random();
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
        gc.setFill(Color.WHITESMOKE);
        for (int i =0; i <50;i++) {
            int x = rand.nextInt(400);
            int y = rand.nextInt(400);
            gc.fillOval(x,  y, RADIUS, RADIUS);
        }
    }

    public static void main(String[] args) {
        launch(args);
  }
}

Другие вопросы по теме