не может преобразовать из String в ObservableValue‹String›

Я делаю программу для управления и отображения данных об аэропортах, их рейсах и так далее. Дело в том, что у меня есть tableView (в javafx) с несколькими tableColumns, и я хочу показать некоторую информацию (судьба, происхождение, компания и т. д.) в каждом столбце, поэтому я набрал это:

@FXML
private TableColumn<Flight, String> destinoCol;

@FXML
private TableColumn<Flight, String> numCol;

@FXML
private MenuButton aeropuerto;

@FXML
private MenuButton tipo;

@FXML
private Button filtrar;

@FXML
private TableColumn<Flight, LocalTime> horaCol;

@FXML
private Button este;

@FXML
private DatePicker fecha;

@FXML
private TableColumn<Flight, String> origenCol;

@FXML
private Label retrasoLabel;

@FXML
private ImageView companiaImg;

@FXML
private VBox detalles;

@FXML
private Button todos;

@FXML
private ImageView avionImg;

@FXML
private Label tipoLabel;

private mainVuelos m;
private List<Airport> aeropuertos;
private Data data;
@FXML
void initialize() {
    data = Data.getInstance();
    aeropuertos = data.getAirportList();
    List<MenuItem> ItemAeropuertos = new LinkedList<MenuItem>();
    for (int i = 0; i < aeropuertos.size(); i++) {
        MenuItem item = new MenuItem(aeropuertos.get(i).getName());
        item.setOnAction((event) -> cambiarAer(event));
        ItemAeropuertos.add(item);
    }
    aeropuerto.getItems().setAll(ItemAeropuertos);
    destinoCol.setCellValueFactory(cellData -> cellData.getValue().getDestiny());
}

Метод getDestiny(), как он говорит, возвращает судьбу конкретного рейса как String, поэтому, очевидно, я не могу использовать последнюю инструкцию, он говорит

cannot convert from String to ObservableValue<String>

но я действительно не знаю, как это решить, чтобы иметь возможность показывать судьбы на этой колонке.


person JOSEMAFUEN    schedule 19.05.2015    source источник


Ответы (2)


Согласно Javadocs, setCellValueFactory(...) ожидает Callback<CellDataFeatures<Flight, String>, ObservableValue<String>>, то есть функцию, которая принимает CellDataFeatures<Flight, String> в качестве параметра и возвращает ObservableValue<String>.

Как говорится в сообщении об ошибке, ваша функция оценивается как String (cellData.getValue().getDestiny()), что не является правильным типом.

У вас есть два варианта, в зависимости от ваших реальных требований.

Либо вы можете на лету создать что-то нужного типа: проще всего использовать ReadOnlyStringWrapper:

destinoCol.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().getDestiny()));

Это отобразит правильное значение, но не будет хорошо «связано» со свойством объекта полета. Если ваша таблица доступна для редактирования, изменения не будут автоматически распространяться на базовый объект, а изменения базового объекта из других источников не будут автоматически обновляться в таблице.

Если вам нужна эта функциональность (и это, вероятно, лучший подход в любом случае), вы должны реализовать класс вашей модели Flight для использования Свойства JavaFX:

public class Flight {

    private final StringProperty destiny = new SimpleStringProperty();

    public StringProperty destinyProperty() {
        return destiny ;
    }

    public final String getDestiny() {
        return destinyProperty().get();
    }

    public final void setDestiny(String destiny) {
        destinyProperty().set(destiny);
    }

    // similarly for other properties...
}

и тогда вы можете сделать

destinoCol.setCellValueFactory(cellData -> cellData.getValue().destinyProperty());
person James_D    schedule 19.05.2015
comment
Я не могу редактировать класс рейсов, поэтому я использовал первое решение, и оно сработало. Спасибо большое. - person JOSEMAFUEN; 20.05.2015
comment
Пожалуйста. Пожалуйста, отметьте ответ как правильный, если он ответил на вопрос. - person James_D; 20.05.2015

Я немного опоздал, я думаю, но это может помочь другим. Вы можете иметь cade, как показано ниже

destinoCol.setCellValueFactory(cellData -> cellData.getValue().destinyProperty().asObject());

Этот код будет работать для свойства, отличного от строки, так как у меня возникла проблема с «LongProperty».

person V.Dev    schedule 20.01.2017