在 Java 中制作多个圆圈

Ben*_*eem -2 java javafx

我在课堂上有一个项目,我需要用简单的三个圆圈来显示交通灯。我从黄色的开始,然后尝试在其他一些随机的地方添加一个红色的,只是为了看看我是否可以做到,但是黄色的是唯一显示的。我不知道红色的是否在黄色的下面,但无论如何,为什么没有显示红色圆圈对我来说没有多大意义。

package tryingGraphicsStuff;
import javafx.application.Application; 
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle;
import javafx.scene.paint.*;
import javafx.scene.text.*;
import javafx.scene.control.*;

public class TryingGraphicsStuff extends Application{
    @Override
    public void start(Stage stage) throws Exception {
        // create circle
                Circle circle = new Circle(); 
                circle.setCenterX(150);
                circle.setCenterY(150);
                circle.setRadius(50);
                circle.setFill(Color.RED);
                // place on pane
                StackPane p = new StackPane();
                p.getChildren().add(circle);
                // ensure it stays centered if window resized
                //circle.centerXProperty().bind(p.widthProperty().divide(2)); 
                //circle.centerYProperty().bind(p.heightProperty().divide(2));

                Circle circleTwo = new Circle();
                circleTwo.setCenterX(400);
                circleTwo.setCenterY(400);
                circleTwo.setRadius(50);
                circleTwo.setFill(Color.YELLOW);
                // place on pane
                p.getChildren().add(circleTwo);


                // create scene from pane
                Scene scene = new Scene(p, 300, 1000);

                // place scene on stage
                stage.setTitle("Circle");
                stage.setScene(scene);
                stage.show();
    }
    public static void main (String [] args)
    {
        Application.launch(args);
    }

}
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 5

A StackPane“将其子项布置在从后到前的堆栈中”。(这里的堆栈在 z 坐标中)。它是一个“布局窗格”,它实际上为您管理子节点的放置。因此,圆的centerXcenterY属性被忽略,并且它们按照添加的顺序出现在另一个之上(因此红色的在黄色的下方,而您看到的唯一的就是黄色的)。默认情况下,堆栈窗格将它们居中。

所有“布局窗格”都为您定位节点。例如,aVBox将在垂直堆栈中放置节点,第一个在顶部,第二个在下面,依此类推。因此,如果您使用 aVBox而不是 a StackPane,则圆圈将出现在另一个下方(在 y 方向),但请注意,它们仍然不会尊重centerXcenterY属性。

Pane类本身不管理其子节点的布局; 所以如果你想使用形状对象的坐标,Pane可能是你最好的选择。Group行为类似,但采用其子边界的联合边界,因此它的行为类似于Pane但其局部坐标系不同。

以下演示显示了所有这些选项。同样,Pane将是一个以直觉方式行事的人。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class CircleLayoutExample extends Application {

    @Override
    public void start(Stage primaryStage) {

        TabPane tabs = new TabPane();

        tabs.getTabs().add(createTab(new StackPane()));
        tabs.getTabs().add(createTab(new VBox()));
        tabs.getTabs().add(createTab(new Pane()));
        tabs.getTabs().add(createTab(new Group()));

        Scene scene = new Scene(tabs, 600, 600);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    private Tab createTab(Pane pane) {
        Circle c1 = new Circle(150, 150, 50, Color.RED);
        Circle c2 = new Circle(400, 400, 50, Color.YELLOW);

        pane.getChildren().addAll(c1, c2);

        Tab tab = new Tab(pane.getClass().getSimpleName());
        tab.setContent(pane);
        return tab ;
    }

    // annoyingly, Pane and Group do not have a common superclass with a getChildren()
    // method, so just reproduce the code...
    private Tab createTab(Group pane) {
        Circle c1 = new Circle(150, 150, 50, Color.RED);
        Circle c2 = new Circle(400, 400, 50, Color.YELLOW);

        pane.getChildren().addAll(c1, c2);

        Tab tab = new Tab(pane.getClass().getSimpleName());
        tab.setContent(pane);
        return tab ;
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明