Поместите весь ComboBox в столбец TableView - PullRequest
0 голосов
/ 03 октября 2019

Образ запуска Java Swing Образ запуска JavaFx Мне нужно добавить весь столбец ComboBox в TableView, а не OservableArrayList в JavaFx, потому что я устанавливаю свойство автозаполнения ComboBox, как Java-свингЯ попробовал это с помощью Java Swing, и он успешно работал, но не работал в javafx

@Override
public void start(Stage primaryStage) {
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);
    TableView table = new TableView();
    ObservableList <String> list = FXCollections.observableArrayList();
    ComboBox comboBox = new ComboBox();

    list.add("Product One");
    list.add("Product Two");
    list.add("Product Three");
    list.add("Product Four");

    table.setEditable(true);
    comboBox.setEditable(true);

    comboBox.setItems(list);

    TextFields.bindAutoCompletion(comboBox.getEditor(), comboBox.getItems());

    TableColumn productName = new TableColumn("Product Name");
    TableColumn productCode = new TableColumn("Product Code");

    productName.setEditable(true);
    productName.setCellValueFactory(ComboBoxTableCell.forTableColumn(list));

    productName.setMinWidth(100);
    productCode.setMinWidth(100);

    table.getColumns().addAll(productName, productCode);
    table.getItems().add(new Object [] {null, null});

    root.getChildren().add(table);

    primaryStage.setTitle("Test");
    primaryStage.setScene(scene);
    primaryStage.show();
}

1 Ответ

0 голосов
/ 04 октября 2019

Сначала необходимо установить ComboBoxTableCell.forTableColumn для cellFactory, а не для cellValueFactory.

Если вы хотите установить отдельный комбинированный список в TableCell, вам нужно включить его с помощью фабрики ячеек. Обратите внимание, что у каждого TableCell будет свой собственный ComboBox (а не один ComboBox, который передается всем ячейкам).

@Override
public void start(Stage primaryStage) {
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);
    ObservableList<String> list = FXCollections.observableArrayList();
    list.add("Product One");
    list.add("Product Two");
    list.add("Product Three");
    list.add("Product Four");

    TableView table = new TableView();
    table.setEditable(true);
    TableColumn productName = new TableColumn("Product Name");
    TableColumn productCode = new TableColumn("Product Code");

    productName.setEditable(true);
    //productName.setCellValueFactory(ComboBoxTableCell.forTableColumn(list));
    productName.setCellFactory(new Callback<TableColumn, TableCell>() {
        @Override
        public TableCell call(TableColumn param) {
            return new TableCell() {
                private ComboBox comboBox;

                @Override
                protected void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!empty) {
                        setGraphic(getComboBox());
                    } else {
                        setGraphic(null);
                    }
                }

                public ComboBox getComboBox() {
                    if (comboBox == null) {
                        comboBox = new ComboBox();
                        comboBox.setEditable(true);
                        comboBox.setItems(list);
                        TextFields.bindAutoCompletion(comboBox.getEditor(), comboBox.getItems());
                    }
                    return comboBox;
                }
            };
        }
    });

    productName.setMinWidth(100);
    productCode.setMinWidth(100);

    table.getColumns().addAll(productName, productCode);
    table.getItems().add(new Object[]{null, null});

    root.getChildren().add(table);

    primaryStage.setTitle("Test");
    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...