所以,我正在做一个小型夜校项目,我们正在“操纵”一个现有圈子。通过单击按钮4(btn4),我需要向StackPane添加几个(数字并不重要)同心圆。 我将它们添加到列表中并尝试使其工作,但我做不到。除该按钮外,其他所有功能均正常。
在btn4动作中:尝试将所有代码放入for循环,foreach中,但是add()方法不接受setFill,因此我将setOnAction()之外的所有内容都放入列表中
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
HBox hb1 = new HBox(20);
hb1.setAlignment(Pos.CENTER);
hb1.setStyle("-fx-background-color:darkgrey;");
Button btn1 = new Button("+");
Button btn2 = new Button("-");
Button btn3 = new Button("Change color");
Button btn4 = new Button("Add concentric circles");
hb1.getChildren().addAll(btn1, btn2, btn3, btn4);
StackPane sp = new StackPane();
sp.setStyle("-fx-background-color:lightblue;");
Circle circle = new Circle(75);
circle.setFill(RED);
sp.getChildren().add(circle);
BorderPane bp = new BorderPane();
bp.setBottom(hb1);
bp.setCenter(sp);
btn1.setOnAction(e -> {
circle.setRadius(circle.getRadius() + 10);
});
btn2.setOnAction(e -> {
circle.setRadius(circle.getRadius() - 10);
});
btn3.setOnAction(e -> {
circle.setFill(Color.color(Math.random(), Math.random(), Math.random(), 1));
});
ArrayList <Circle> moreCircles = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
new Circle(circle.getRadius() - (i * 5)).setFill(Color.color(Math.random(), Math.random(), Math.random(), 1));
}
btn4.setOnAction(e -> {
for(Circle c : moreCircles) {
sp.getChildren().add(c);
}
});
Scene scene = new Scene(bp, 500, 350);
primaryStage.setTitle("Game with circles");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我想使这些新的同心圆比现有的同心圆略小。要一次全部添加它们,我当然希望它们可见,所以我添加了一些颜色。
感谢@anthony yaghi为我解决了这个小问题
按钮动作需要看起来像这样,并且上面的Array可以进行一些删除:
btn4.setOnAction(e -> {
for (int i = 1; i <= 10; i++) {
sp.getChildren().add(new Circle(circle.getRadius() - (i*5), Color.color(Math.random(), Math.random(), Math.random(), 1)));
}
});
答案 0 :(得分:4)
首先,仅在创建数组列表之后的for循环是没有用的。您正在创建新圈子,但不对其进行任何操作,我想您正在尝试将添加到列表中,但是如果您查看的可用构造函数,则不能执行“ new Circle(...)然后是.setFill”圆形对象,您会看到有一个需要半径和颜色的填充对象,您可以改为:
new Circle(circle.getRadius() - (i*5), Color.color(Math.random(), Math.random(), Math.random(), 1));
如果您只想在当前圆中添加n个圆,而不管以后会发生什么(如果主圆变大或变小),则无需将其添加到列表中并跟踪只需将它们直接添加到StackPane中即可。
/*
ArrayList<Circle> moreCircles = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
new Circle(circle.getRadius() - (i * 5)).setFill(Color.color(Math.random(), Math.random(), Math.random(), 1));
}
*/
btn4.setOnAction(e -> {
for (int i = 1; i <= 10; i++) {
sp.getChildren().add(new Circle(circle.getRadius() - (i*5), Color.color(Math.random(), Math.random(), Math.random(), 1)));
}
});