我正在制作一个程序来管理和显示有关机场,航班等的数据。 事实是我有一个带有几个tableColumns的tableView(在javafx中),我想在每一列上显示一些信息(命运,起源,公司等),所以我键入了这个:
@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(),因为它表示将特定航班的de destiny返回为String,所以显然我不能使用最后一条指令,它说“无法从String转换为ObservableValue”但我真的不知道如何解决它,以便能够显示该列的命运。谢谢大家。
答案 0 :(得分:9)
根据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()));
这将显示正确的值,但不会很好地连接&#34;到飞行物体的属性。如果您的表格是可编辑的,则编辑不会自动传播回基础对象,并且从其他地方对基础对象的更改不会在表格中自动更新。
如果您需要此功能(这可能是一种更好的方法),您应该实现模型类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());
答案 1 :(得分:3)
我觉得我有点迟了,但这可能对其他人有所帮助。 您可以通过以下方式进行cade
destinoCol.setCellValueFactory(cellData -> cellData.getValue().destinyProperty().asObject());
此代码适用于字符串以外的属性,因为我遇到了“LongProperty”的问题。