我需要一些帮助来创建一个像ms访问一样的网格窗格的连续表单。最初,gridpane有1行3列
| Choicebox |删除按钮|添加按钮|
def capitals(word):
return sorted([
index for index, letter in enumerate(word) if letter.isupper()
])
结果应如下所示:
如何从列表中删除选择框的行和值? 如果更改了选项框,如何更新我的列表?
答案 0 :(得分:3)
我建议将ListView与自定义ListCell而不是GridPane一起使用,因为您的汽车列表可能包含例如1k值。在这种情况下,您将在GridPane中创建3k节点,这将降低性能。 ListView将仅创建可见单元格并在需要时重用它们。
试试这段代码:
private ObservableList<Car> cars = FXCollections.observableArrayList();
@Override
public void start(Stage primaryStage) {
cars.addAll(new Car(CAR_TYPE.CAR1), new Car(CAR_TYPE.CAR2), new Car(CAR_TYPE.CAR3));
ListView<Car> carsListView = new ListView<>();
carsListView.setCellFactory(c -> new CarListCell());
carsListView.setItems(cars);
StackPane root = new StackPane();
root.getChildren().add(carsListView);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Cars list view");
primaryStage.setScene(scene);
primaryStage.show();
}
private class CarListCell extends ListCell<Car> {
private HBox content = new HBox();
private ChoiceBox<CAR_TYPE> cb = new ChoiceBox<>();
private Button add = new Button("+");
private Button sub = new Button("-");
public CarListCell() {
cb.setItems(FXCollections.observableArrayList(CAR_TYPE.values()));
cb.setMaxWidth(Double.MAX_VALUE);
HBox.setHgrow(cb, Priority.ALWAYS);
content.getChildren().addAll(cb, add, sub);
content.setSpacing(10);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(content);
}
@Override
protected void updateItem(Car item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
setGraphic(content);
cb.setValue(item.getType());
add.setOnAction(e -> {
Car newCar = new Car(cb.getValue());
cars.add(newCar);
});
sub.setOnAction(e -> {
cars.remove(item);
});
}
}
}
private enum CAR_TYPE {
CAR1, CAR2, CAR3;
}
private class Car {
private CAR_TYPE type;
public Car(CAR_TYPE type) {
this.type = type;
}
public CAR_TYPE getType() {
return type;
}
public void setType(CAR_TYPE type) {
this.type = type;
}
}
答案 1 :(得分:0)
我添加了第二个下拉列表,一个保存按钮,并用一个空的初始列表更改了开头。这样可以正常工作,但是当我点击保存按钮时,如何将所有选定的汽车颜色添加到ArrayList中?
如果我选择第一辆带有颜色的汽车而不点击“+”按钮,则ObservableList为空。
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
private ObservableList<Car> cars = FXCollections.observableArrayList();
@Override
public void start(Stage primaryStage) {
Car initialCar = new Car(null,null);
cars.add(initialCar);
ListView<Car> carsListView = new ListView<>();
carsListView.setCellFactory(c -> new CarListCell());
carsListView.setItems(cars);
StackPane root = new StackPane();
root.getChildren().addAll(carsListView, new Button("Save"));
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Cars list view");
primaryStage.setScene(scene);
primaryStage.show();
}
private class CarListCell extends ListCell<Car> {
private HBox content = new HBox();
private ChoiceBox<CAR_TYPE> cb_car = new ChoiceBox<>();
private ChoiceBox<CAR_COLOR> cb_color = new ChoiceBox<>();
private Button add = new Button("+");
private Button sub = new Button("-");
public CarListCell() {
cb_car.setItems(FXCollections.observableArrayList(CAR_TYPE.values()));
cb_color.setItems(FXCollections.observableArrayList(CAR_COLOR.values()));
HBox.setHgrow(cb_car, Priority.ALWAYS);
HBox.setHgrow(cb_color, Priority.ALWAYS);
content.getChildren().addAll(cb_car, cb_color, add, sub);
content.setSpacing(10);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(content);
}
@Override
protected void updateItem(Car item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
setGraphic(content);
cb_car.setValue(item.getType());
cb_color.setValue(item.getColor());
add.setOnAction(e -> {
Car newCar = new Car(cb_car.getValue(), cb_color.getValue());
cars.add(newCar);
});
sub.setOnAction(e -> {
cars.remove(item);
});
}
}
}
private enum CAR_TYPE {
CAR1, CAR2, CAR3;
}
private enum CAR_COLOR {
BLUE, RED, GREEN;
}
private class Car {
private CAR_TYPE type;
private CAR_COLOR color;
public Car(CAR_TYPE type, CAR_COLOR color) {
this.type = type;
this.color = color;
}
public CAR_TYPE getType() {
return type;
}
public void setType(CAR_TYPE type) {
this.type = type;
}
public CAR_COLOR getColor() {
return color;
}
public void setColor(CAR_COLOR color) {
this.color = color;
}
}
}