【问题标题】:Creating a dynamic GridPane (add and remove rows)创建动态 GridPane(添加和删除行)
【发布时间】:2016-11-13 01:32:32
【问题描述】:

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

所以在选择MenuItem时,它应该在现有的gridpane中添加1或2行。取消选择时应删除 1 或 2 行。

总是有一个固定的行不能被删除。添加或删除的行应在此固定行上方添加或删除。

例如:

添加行:

added ---------  

added ---------  

fixed ---------

删除行:

removed 

removed 

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

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

GridPanes 有一个内置的 addRow 函数,也许它就是要使用的函数。我该如何解决这个问题?谢谢!所有提示表示赞赏。

【问题讨论】:

  • 只隐藏/显示行而不是添加和删除它们会更容易吗?这符合您的需求吗?
  • 是的,我想这会起作用,但它不能是顶行和底行之间的空格。在这种情况下,它们应该放在一起。
  • 有一个 Java swing 示例,它是如何工作的,除了在下面而不是上面添加行:lionblogger.com/…。使用此示例并集成到我的项目中是否是一种好方法?使用 JavaFX 时如何使用 Swing 组件?
  • 我为您创建了一个答案。如果不是完全必要,则不应混合使用 Swing 和 JavaFX(在这种情况下,可以使用纯 JavaFX 代码来实现)。

标签: java javafx gridpane


【解决方案1】:

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

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

我使用了RowConstraints 类:我为GridPane 添加了三个RowConstraints,然后按下按钮将前两个约束的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);
    }
}

它会产生这样的东西:

【讨论】:

  • 非常感谢!所以我遇到了一些问题才能让它工作,所以我把它改成了 2 个单独的按钮,1 个显示和 1 个隐藏。并在按钮上放置一个事件动作。它在显示按钮上做了正确的事情。在隐藏时,它会删除 2 行,但在上面保留 1 行。然后就卡在了异常中
  • 请更新问题,而不是随更新发布答案。当您更新问题时,请发布您拥有的整个代码。
  • 让它工作。尝试将 X 列添加到每一行: grid.add(new Label(" "),count,i);其中 count 是一个 for 循环,i 是行索引。不会产生正确的结果。有没有办法将 X 列添加到 RowConstraints()?
  • 一般来说,RowConstrainnts(正如它的名字)描述了一行上的一些containts。存在一个兄弟,该类称为 ColumnConstraint,可以与列类似地使用。我没有看到您的代码,我不知道您是如何调整答案的。但是:这个问题是关于如何显示/隐藏网格的前两列。这个问题得到了回答。如果您还有其他问题/疑问,请提出单独的问题。
  • 是的,我将使用 ColumnConstraint 进行更多测试。非常感谢!
【解决方案2】:

非常感谢!所以我在让它工作时遇到了一些问题,所以我把它改成了 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); // 列=3 行=1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多