I need some help creating a continuous form with a gridpane like in ms access. Initially the gridpane has 1 row and 3 columns
| Choicebox | Delete Button | Add Button |
public class myGridpane {
@FXML
private GridPane gp_form;
private List<Car> myCars = new ArrayList();
public void initialize() {
myCars = loadCars();
initGridpane(myCars);
}
private initGridpane(List<Car> myCars) {
int rowIndex = 0;
for (Car myCar : myCars) {
Button b_newCar = new Button("+");
Button b_deleteCar = new Button("-");
ChoiceBox<Car> cb_car = new ChoiceBox<>();
cb_car.setItems(Car.getAllCarKeys());
cb_car.setValue(myCar.getModel());
b_deleteCar.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
// remove row
// remove car from List myCars
}
});
b_newCar.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
// add new row
}
});
cb_car.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
// update myList
}
});
gp_form.add(cb_car, 0, rowIndex);
gp_form.add(b_deleteCar, 1, rowIndex);
gp_form.add(b_newCar, 2, rowIndex);
rowIndex++;
}
}
}
The result should look like this:
.
How do I remove the row and the value of the choicebox from my list? And how do I update my list if a choicebox is changed?
I suggest to use ListView with custom ListCell instead of GridPane because your cars list may contain for example 1k values. In that case you will create 3k nodes in GridPane and it will reduce performance. ListView will create only visible cells and reuse them when needed.
Try this code: