在Java中创建多个圈子

时间:2016-03-30 12:22:28

标签: java javafx

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

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);
    }

}

4 个答案:

答案 0 :(得分:2)

A StackPane“将孩子放在一个从后到前的堆栈中”。 (这里的堆栈是z坐标)。它是一个“布局窗格”,它实际上为您管理子节点的位置。因此,圈子的centerXcenterY属性会被忽略,它们会按照添加的顺序显示在另一个的顶部(因此红色的一个位于黄色的下方,而且只有你看到的是黄色的)。默认情况下,堆栈窗格将它们居中。

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

centerY类本身不管理其子节点的布局;因此,如果您想使用形状对象的坐标,Pane可能是您的最佳选择。 Pane的行为类似,但是它接受了子边界的并集,因此它的行为类似于Group,但它的局部坐标系是不同的。

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

Pane

enter image description here

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

是的,你们两个圈子都重叠了。 您只需使用VBox代替StackPane。它将解决您的问题。

VBox p = new VBox();

答案 2 :(得分:0)

正如其他答案所暗示的那样,使用VBox会在这里帮助你最多,因为它会自动将其子项放入垂直行。这是一个使用数组的简短代码段(因此您可以根据需要创建任意数量的圆圈)

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.paint.*;

public class TryingGraphicsStuff extends Application{
    @Override
    public void start(Stage stage) throws Exception {

            Circle[] circle = new Circle[3];          // create 3 circles
            VBox vBox = new VBox();                   // vbox will put circles in vertical row
            vBox.setAlignment(Pos.CENTER);            // center circles

            for(int i = 0; i < circle.length; i++){
                circle[i] = new Circle(50);           // initialize circles with radius of 50
                vBox.getChildren().add(circle[i]);
            }

            circle[0].setFill(Color.RED);
            circle[1].setFill(Color.YELLOW);
            circle[2].setFill(Color.GREEN);

            // add vbox to scene

            Scene scene = new Scene(vBox, 300, 800);
            stage.setTitle("Circle");
            stage.setScene(scene);
            stage.show();
    }
    public static void main (String [] args){
        Application.launch(args);
    }

}

与往常一样,了解代码,不要盲目地复制和粘贴。干杯!

答案 3 :(得分:-1)

我实际上对上面的代码感到有点困惑。根据你的数字,红色的应该是显示的而不是黄色的。你的场景只有300像素宽,你将黄色圆圈置于400的中心位置,使其不在视野范围内(半径只有50)。

增加场景大小或在视图中移动圈子。