2015-05-19 4 views
3

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

@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, поэтому, очевидно, я не могу использовать последнюю инструкцию, она говорит: «Невозможно преобразовать из String в ObservableValue», но я действительно не знаю, как ее решить, чтобы быть в состоянии показать судьбы в этой колонке. Спасибо всем.

ответ

8

Согласно 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 properties:

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()); 
+0

Я не могу редактировать класс рейсов, поэтому я использовал первое решение, и оно сработало. Спасибо тебе большое. – JOSEMAFUEN

+0

Добро пожаловать. Пожалуйста, отметьте ответ как правильно, если он ответил на вопрос. –

1

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

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

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