TableColumns可以在TableView中包含不同的类吗?

时间:2018-04-03 23:44:40

标签: javafx callback tableview tablecolumn

我正在尝试使用特定菜单项的价格来填充tablePrice列。下面显示的代码工作正常,但我必须在MenuItem类中创建一个以前不存在的价格变量。 MenuItemPricedMenuItem以及其他类是从餐馆管理系统的UML域模型生成的。由于我正在修改域模型,因此不鼓励使用此当前方法。

评论部分显示我在setCellValueFactory()上出现错误的程度。有TableView包含不同类的列的方法吗?如果是这样,有人可以帮助我直接从PricedMenuItem课程填写专栏吗?

MenuItem有一个私有nameitemCategory枚举,以及getCurrentPricedMenuItem()方法。

PricedMenuItem有私有pricegetPrice()方法。

@FXML private TableView<MenuItem> tableView;
@FXML private TableColumn<MenuItem, String> tableName;
@FXML private TableColumn<MenuItem, Double> tablePrice;
@FXML private TableColumn<MenuItem, ItemCategory> tableCategory;

@Override
public void initialize(URL location, ResourceBundle resources) {
    tableName.setCellValueFactory(new PropertyValueFactory<MenuItem, String>("Name"));
    tableCategory.setCellValueFactory(new PropertyValueFactory<MenuItem, ItemCategory>("itemCategory"));
    tablePrice.setCellValueFactory(new PropertyValueFactory<MenuItem, Double>("price"));

    /*way to retrieve price directly from PMI
    tablePrice.setCellValueFactory(new Callback<CellDataFeatures<MenuItem, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call( CellDataFeatures<MenuItem, String> c) {
          return new SimpleStringProperty(c.getValue().getValue().getCurrentPricedMenuItem().getPrice()+"");
         }
        }); 
    */

    categoryDropDown1.getItems().setAll(ItemCategory.values());
    categoryDropDown2.getItems().setAll(ItemCategory.values());

    tableView.setItems(loadCurrentMenuItems());
    updateBox("Select a menu item to edit.", Color.BLACK);
}

1 个答案:

答案 0 :(得分:0)

tablePrice声明为

@FXML private TableColumn<MenuItem, Number> tablePrice;

(请参阅JavaFX Properties in TableView了解原因)。

然后单元格值工厂应该返回Property<Number>(你的回复Property<String>),所以你需要

tablePrice.setCellValueFactory(new Callback<CellDataFeatures<MenuItem, Number>, ObservableValue<Number>>() {
    @Override
    public ObservableValue<Number> call( CellDataFeatures<MenuItem, Number> c) {
      return new SimpleDoubleProperty(c.getValue().getCurrentPricedMenuItem().getPrice());
    }
}); 

或者,使用lambda表达式去除大部分样板代码

tablePrice.setCellValueFactory(cellData -> 
    new SimpleDoubleProperty(cellData.getValue().getCurrentPricedMenuItem().getPrice()));

(我很确定你不应该在那里进行两次getValue()次调用......但你没有发布你的模型类。)