我在课堂上有一个项目,我需要只用三个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);
}
}
答案 0 :(得分:2)
A StackPane
“将孩子放在一个从后到前的堆栈中”。 (这里的堆栈是z坐标)。它是一个“布局窗格”,它实际上为您管理子节点的位置。因此,圈子的centerX
和centerY
属性会被忽略,它们会按照添加的顺序显示在另一个的顶部(因此红色的一个位于黄色的下方,而且只有你看到的是黄色的)。默认情况下,堆栈窗格将它们居中。
所有“布局窗格”为您定位节点。例如,VBox
将节点放在垂直堆栈中,第一个位于顶部,第二个位于下方,依此类推。因此,如果您使用VBox
而不是StackPane
,则圆圈会出现在另一个下方(在y方向上),但请注意它们仍然不会尊重centerX
和{ {1}}属性。
centerY
类本身不管理其子节点的布局;因此,如果您想使用形状对象的坐标,Pane
可能是您的最佳选择。 Pane
的行为类似,但是它接受了子边界的并集,因此它的行为类似于Group
,但它的局部坐标系是不同的。
以下演示显示了所有这些选项。同样,Pane
将是一种以直观方式行事的人。
Pane
答案 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)。
增加场景大小或在视图中移动圈子。