使用按钮将对象添加到列表中并将这些列表对象添加到窗格中

时间:2019-04-22 05:16:38

标签: java javafx

所以,我正在做一个小型夜校项目,我们正在“操纵”一个现有圈子。通过单击按钮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)));
        }
    });

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