因此,在选择或取消选择MenuItem
时,我需要在GridPane中添加和删除行。
因此,在选择MenuItem
时,它应在现有GridPane中添加1或2行。取消选择时,应删除1行或2行。
始终存在无法删除的固定行。应在此固定行上方添加或删除添加或删除的行。
例如:
添加行:
added ---------
added ---------
fixed ---------
删除行:
removed
removed
fixed -----------
我知道如何处理MenuItems的操作。我只需要动态网格窗格的帮助。
GridPanes有一个内置函数addRow,可能是它的使用者。我怎么解决这个问题?谢谢!所有提示赞赏。
答案 0 :(得分:1)
这个答案是隐藏和显示GridPane
的行,而不是添加和删除它们,因为我认为每次选择MenuItem
时都不创建新对象更合理。
我为您制作了一个示例,其中包含GridPane
和Button
(而不是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);
}
}
它产生这样的东西:
答案 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