TableView适用于不同型号

时间:2017-10-19 16:56:53

标签: java javafx tableview

我试图在TableView中实现以下功能:

prod_name | prod_comment | ... | kcal | kjoule |
--------------------------------------------
name      |  hi          |     | 1.5  |   5 
name      |  hi          |     | 2.0  |   7

这些是我合作过的模特:

Product (holds things like name,comment etc)
Nutrient (holds the kcal, kjoule strings etc)
Product_Nutrient (holds the amounts of kcal, kjoule etc for every product)

我目前拥有的是一个DAO(和一个单独的模型)层,它连接所有这些表并以上面的确切格式返回它们,但对于这个项目不允许使用SQL加入(学校项目)。我并不认为这会成为一个问题,但现在确实如此。

我还试图将这三个模型作为列表包装到一个模型中,但我不确定如何保持模型之间的关系,以及如何在{{1}中显示它们}。 (same as shown here

如果有任何不清楚的地方,请告诉我,以便我可以添加更多信息。

EDIT;

有些澄清:

某些TableView可能不会Product

中的每个Nutrient

例如:

ProductNutrient

此处prod_id | nutrient_id | amount | 1 1 0.0 1 2 5.1 2 1 1.4 3 1 0.2 3 2 0.0 2没有prod_id 2,因为nutrient_id与不存在的不同。

编辑:

型号:

0.0

1 个答案:

答案 0 :(得分:1)

我将这些类定义为

public class Product {

    private int id ;

    private String name ;
    private String comment ;

    // constructor and get methods

}
public class Nutrient {

    private int id ;

    private String name ;
    private double kcal ;

    // ...
}
public class ProductNutrientContent {

    private Product product ;
    private Nutrient nutrient ;
    private double quantity ;

    // ...
}

您不能使用内部联接的要求非常人为,但只要数据库不是太大,您就可以使用三个查询来获取ProductNutrient个对象的列表,如下所示: / p>

Map<Integer, Product> productsById ;
Map<Integer, Nutrient> nutrientsById ;
List<ProductNutientContent> productNutrientContents ;

// query product table, for each row in the result set do:
  Product product = new Product(/* data from result set row */);
  productsById.put(product.getId(), product);

// similarly populate nutrientsById...

// query join table, for each row in join table do:
  int productId = ... ; // productId from row in result set
  int nutrientId = ... ; // nutrientId from row in result set
  double quantity = ... ; // quantity from row in result set
  ProductNutrientContent content 
      = new ProductNutrientContent(productsById.get(productId), nutrientsById.get(nutrientId), quantity);
  productNutrientContents.add(content);

现在您可以使用列表填充表格。对于表格列,只需做一件明显的事情:

TableColumn<ProductNutrientContent, String> productNameColumn = new TableColumn<>("Product");
productNameColumn.setCellValueFactory(cellData -> 
    new SimpleStringProperty(cellData.getValue().getProduct().getName()));

TableColumn<ProductNutrientContent, Number> kcalColumn = new TableColumn<>("kcal");
kcalColumn.setCellValueFactory(cellData -> 
    new SimpleDoubleProperty(cellData.getValue().getNutrient().getKcal()));

TableColumn<ProductNutrientContent, Number> quantityColumn = new TableColumn<>("Quantity");
quantityColumn.setCellValueFactory(cellData -> 
    new SimpleDoubleProperty(cellData.getValue().getQuantity());