创建动态GridPane(添加和删除行)

时间:2016-07-11 07:21:01

标签: java javafx gridpane

因此,在选择或取消选择MenuItem时,我需要在GridPane中添加和删除行。

因此,在选择MenuItem时,它应在现有GridPane中添加1或2行。取消选择时,应删除1行或2行。

始终存在无法删除的固定行。应在此固定行上方添加或删除添加或删除的行。

例如:

添加行:

added ---------  

added ---------  

fixed ---------

删除行:

removed 

removed 

fixed ----------- 

我知道如何处理MenuItems的操作。我只需要动态网格窗格的帮助。

GridPanes有一个内置函数addRow,可能是它的使用者。我怎么解决这个问题?谢谢!所有提示赞赏。

2 个答案:

答案 0 :(得分:1)

这个答案是隐藏和显示GridPane的行,而不是添加和删除它们,因为我认为每次选择MenuItem时都不创建新对象更合理。

我为您制作了一个示例,其中包含GridPaneButton(而不是MenuItem,但它具有相同的功能)。按下按钮后,GridPane的前两行将显示或隐藏。

我使用了RowConstraints类:我为RowConstraints添加了三个GridPane,然后按下按钮,前两个约束的maxHeightProperty设置为0 (隐藏)或30(显示)。

public class Main extends Application {

    private SimpleBooleanProperty expanded = new SimpleBooleanProperty(true);

    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);


            VBox vbox = new VBox();


            GridPane grid = new GridPane();
            // Just to see that the lines are actually added
            grid.setGridLinesVisible(true);
            grid.setPrefWidth(200);

            grid.getRowConstraints().add(new RowConstraints(30));
            grid.getRowConstraints().add(new RowConstraints(30));

            grid.addRow(2, new Label("I am fixed!"));
            grid.getRowConstraints().add(new RowConstraints(30));



            Button showOrHideButton = new Button();
            showOrHideButton.setOnAction((e) -> {
                expanded.set(expanded.not().get());
            });


            vbox.getChildren().addAll(showOrHideButton, grid);

            expanded.addListener((obs, oldVal, newVal) -> {
                if(newVal) {
                    grid.getRowConstraints().get(0).setMaxHeight(30);
                    grid.getRowConstraints().get(1).setMaxHeight(30);
                    showOrHideButton.setText("Hide");
                } else {
                    grid.getRowConstraints().get(0).setMaxHeight(0);
                    grid.getRowConstraints().get(1).setMaxHeight(0);
                    showOrHideButton.setText("Show");
                }
            });

            expanded.set(false);


            root.setCenter(vbox);

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

它产生这样的东西:

enter image description here

答案 1 :(得分:0)

非常感谢!所以我有一些问题让它工作,所以我把它改成了2个单独的按钮,1个显示和1个隐藏。并在按钮上放置一个事件动作。它在显示按钮上做了正确的事情。在隐藏它删除2行但保持1行以上,不知道为什么。然后它被困在异常中。

@FXML
private void add_act(ActionEvent event) {
    SimpleBooleanProperty expanded = new SimpleBooleanProperty(true);

        // Just to see that the lines are actually added
        grid.setGridLinesVisible(true);

        grid.getRowConstraints().add(new RowConstraints(30)); //add 1 row
        grid.getRowConstraints().add(new RowConstraints(30)); //add 1 row

        grid.addRow(2, new Label("I am fixed!")); //on index 2 write label

        show.setOnAction((e) -> {
            expanded.set(expanded.not().get());
        });

}

@FXML
private void hide_act(ActionEvent event) {
    SimpleBooleanProperty expanded = new SimpleBooleanProperty(true);

        // Just to see that the lines are actually added
        grid.getRowConstraints().get(0).setMaxHeight(0);
        grid.getRowConstraints().get(1).setMaxHeight(0);

        show.setOnAction((e) -> {
            expanded.set(expanded.not().get());
        });
}

此外,我还需要跟踪添加或删除的行索引。可能完成:setRowIndex(button,1),setColumnIndex(button,2),setConstraints(label,3,1); // column = 3 row = 1