我在课堂上有一个项目,我需要用简单的三个圆圈来显示交通灯。我从黄色的开始,然后尝试在其他一些随机的地方添加一个红色的,只是为了看看我是否可以做到,但是黄色的是唯一显示的。我不知道红色的是否在黄色的下面,但无论如何,为什么没有显示红色圆圈对我来说没有多大意义。
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)
A StackPane
“将其子项布置在从后到前的堆栈中”。(这里的堆栈在 z 坐标中)。它是一个“布局窗格”,它实际上为您管理子节点的放置。因此,圆的centerX
和centerY
属性被忽略,并且它们按照添加的顺序出现在另一个之上(因此红色的在黄色的下方,而您看到的唯一的就是黄色的)。默认情况下,堆栈窗格将它们居中。
所有“布局窗格”都为您定位节点。例如,aVBox
将在垂直堆栈中放置节点,第一个在顶部,第二个在下面,依此类推。因此,如果您使用 aVBox
而不是 a StackPane
,则圆圈将出现在另一个下方(在 y 方向),但请注意,它们仍然不会尊重centerX
和centerY
属性。
在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)