ComboBoxTableCell, обратный вызов - PullRequest
0 голосов
/ 12 мая 2018

У меня есть вопрос, который я никак не могу решить.Я прочитал все, что нашел в Интернете, и перепробовал десятки кодов, но у меня все еще нет решения.

Это проект JavaFX, который следует модели MVC.Файл fxml имеет следующий вид:

Основной класс:

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {

        AnchorPane root = null;
        try {
            root = (AnchorPane) FXMLLoader.load(getClass().getResource("sample.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();

    }
}

Контроллер для файла fxml:

public class Controller {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private TableView<Fila> taula;

    @FXML
    private TableColumn<Fila, String> c1;

    @FXML
    private TableColumn<Fila, ObservableList<String>> c2;

    @FXML
    void initialize() {
        assert taula != null : "fx:id=\"taula\" was not injected: check your FXML file 'sample.fxml'.";
        assert c1 != null : "fx:id=\"c1\" was not injected: check your FXML file 'sample.fxml'.";
        assert c2 != null : "fx:id=\"c2\" was not injected: check your FXML file 'sample.fxml'.";

        ObservableList<Fila> dades = FXCollections.observableArrayList(
                new Fila("First", FXCollections.observableArrayList("1", "2", "3")),
                new Fila("Second", FXCollections.observableArrayList("4", "5", "6")),
                new Fila("Third", FXCollections.observableArrayList("7", "8", "9"))
        );

        c1.setCellValueFactory(cellData -> cellData.getValue().c1Property());

        c2.setCellValueFactory(cellData -> cellData.getValue().c2Property());



        taula.setItems(dades);

    }
}

И класс компонента:

public class Fila {

    private StringProperty c1;
    private ListProperty<String> c2;

    public Fila(String c1, ObservableList<String> c2) {
        this.c1 = new SimpleStringProperty(c1);
        this.c2 = new SimpleListProperty<>(c2);
    }

    public String getC1() {
        return c1.get();
    }

    public StringProperty c1Property() {
        return c1;
    }

    public void setC1(String c1) {
        this.c1.set(c1);
    }

    public ObservableList<String> getC2() {
        return c2.get();
    }

    public ListProperty<String> c2Property() {
        return c2;
    }

    public void setC2(ObservableList<String> c2) {
        this.c2.set(c2);
    }
}

Чего я не понимаю, так это того, что во втором столбце появляется ComboBox со значениями, которые теперь отображаются как List ...

Я думаю, что это можетбыть достигнутым с помощью метода setCellFactory вместе с Callback для столбца, где мы хотим получить ComboBox, но я не могу его получить ...

Извините за мой уровень английского языка;Очевидно, что я использую переводчик ...

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете сделать

    c2.setCellFactory(column -> new TableCell<Fila, ObservableList<String>>() {

        private final ComboBox<String> combo = new ComboBox<>();

        {
            combo.valueProperty().addListener((obs, oldValue, newValue) -> {
                // in real life, update model appropriately here...
                System.out.println("Selected "+newValue+" for "+getTableView().getItems().get(getIndex()).getC1());
            });
        }

        @Override
        protected void updateItem(ObservableList<String> items, boolean empty) {
            super.updateItem(items, empty);
            if (empty) {
                setGraphic(null);
            } else {
                combo.setItems(items);
                // in real life, do combo.setValue(...) with some value from model
                setGraphic(combo);
            }
        }
    });

Ваша модель на самом деле не предоставляет достаточно информации для поля со списком, так как не имеет никакого свойства, представляющего, какой элемент в поле со списком выбран. Предположительно, вы просто не добавили это в пример, который вы опубликовали; прослушиватель valueProperty() поля со списком должен соответствующим образом обновить его, а метод updateItem() должен установить значение поля со списком в зависимости от соответствующих данных.

...