При выполнении следующего кода создается просто пустое окно, так как не отображаются видимые круги. Ожидается, что на окне появятся случайно расположенные черные кружки.
Вот мой код:
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() для объекта, отличного от того, который используется для создания пользовательского интерфейса (т.е. вызывается объект, отличный от start()). Просто позвоните drawCircles() прямо с start().
Спасибо :), извините, теперь это так очевидно




Метод 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);
}
}
Где вы называете свой метод
drawCircles()?