【问题标题】:cannot convert from String to ObservableValue<String>无法从 String 转换为 ObservableValue<String>
【发布时间】:2015-07-31 19:15:03
【问题描述】:

我正在制作一个程序来管理和显示有关机场、航班等的数据。 事实是我有一个带有几个 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(),正如它所说,将特定航班的命运返回为String,所以显然我不能使用最后一条指令,它说

cannot convert from String to ObservableValue<String>

但我真的不知道如何解决它以便能够在该列上显示命运。

【问题讨论】:

    标签: javafx tableview tablecolumn


    【解决方案1】:

    根据JavadocssetCellValueFactory(...) 需要一个Callback&lt;CellDataFeatures&lt;Flight, String&gt;, ObservableValue&lt;String&gt;&gt;,即一个以CellDataFeatures&lt;Flight, String&gt; 作为其参数的函数,并产生一个ObservableValue&lt;String&gt;

    如错误消息所述,您的函数计算结果为 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());
    

    【讨论】:

    • 我无法编辑航班舱位,所以我使用了第一个解决方案,它奏效了。非常感谢你。
    • 不客气。如果回答了问题,请将答案标记为正确。
    【解决方案2】:

    我想我有点晚了,但这可能对其他人有所帮助。 你可以有如下的cade

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

    此代码适用于字符串以外的属性,因为“LongProperty”有问题。

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多