向 TableView 添加新列 - JAVA FX
Add New Column to TableView - JAVA FX
我有 class 项(名称、ID、数量等)和 class 评级。每个项目都有评级表。我制作了计算产品平均值的函数(通过取 item_id),并且我有带项目的 TableView。现在我有两个问题。我必须将该平均值添加到 TableView(作为新的 Columny "Average"),然后使每个产品都有其平均值(当函数采用 item_id 时这是问题,但它必须这样做)。
项目class:
public class Item implements Serializable {
static int idCounter=0;
@Id
@Column(name = "car_id") // Mam swiadomosc
@GeneratedValue(generator = "increment")
@GenericGenerator(name="increment", strategy ="increment")
int id;
@Column(name = "item_name",length = 100,nullable =false)
String name;
@Enumerated(EnumType.STRING)
@Column(name = "Item_status", length = 100, nullable = false)
Itemstatus status;
@Column(name = "weight")
double weight;
@Column(name = "amount")
public int amount;
@Column(name = "price")
double price;
@Column(name = "WH_name",length = 100,nullable = false)
String WHname;
transient public int bought = 0;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name="car_id")
public List<Rating> RatingList=new ArrayList<>();
TableView+ 项目列表:
private ObservableList<Item> getItem() {
ObservableList<Item> items=FXCollections.observableArrayList();
FulfillmentCenter F1 = FulfillmentCenterContainer.search( comboBox.getValue());
if(!comboBox.getValue().equals("dowolny"))
items=FXCollections.observableArrayList(F1.ProductList);
else
for(int i = 0; i< FulfillmentCenterContainer.WareHouseList.size(); i++){
items.addAll(FulfillmentCenterContainer.WareHouseList.get(i).ProductList);
}
return items;
}
private TableView<Item> getTable(){
TableColumn<Item,String> column1 = new TableColumn<>("Name of Item");
column1.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<Item,String> column5 = new TableColumn<>("Status of Item");
column5.setCellValueFactory(new PropertyValueFactory<>("status"));
TableColumn<Item, Double> column2 = new TableColumn<>("Price in $");
column2.setCellValueFactory(new PropertyValueFactory<>("price"));
TableColumn<Item, Double> column6 = new TableColumn<>("Weight");
column6.setCellValueFactory(new PropertyValueFactory<>("weight"));
TableColumn<Item,Integer> column7 = new TableColumn<>("Amount of Item");
column7.setCellValueFactory(new PropertyValueFactory<>("amount"));
TableColumn<Item,String> column4 = new TableColumn<>("Name of Warehouse");
column4.setCellValueFactory(new PropertyValueFactory<>("WHname"));
TableColumn<Item,Integer> column3 = new TableColumn<>("ID of Item");
column3.setCellValueFactory(new PropertyValueFactory<>("id"));
tableView=new TableView<>();
tableView.setItems(getItem());
tableView.getColumns().addAll(column1,column2,column3,column4,column5,column6,column7);
pane.getChildren().add(tableView);
tableView.setMinWidth(643);
GridPane.setConstraints(tableView,0,0,1,10);
addButtonToTable();
tultip(tableView);
getList();
return tableView;
}
dowolny= 任何
并获得评级功能:
public double averageRate(int item_id){
Session session = sessionFactory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Integer> criteria = builder.createQuery( Integer.class );
Root<Rating> root = criteria.from( Rating.class );
criteria.select(root.get("mark"));
criteria.where( builder.equal( root.get( "car_id" ), item_id ) );
List<Integer> ratingList=session.createQuery(criteria).getResultList();
double average=0;
double counter=0;
for( Integer integer: ratingList) {
//if(idList.get(0))
average += integer;
counter++;
}
if(counter!=0)
return average/counter;
else
return 0;
}
我必须使用标准来获取它(我知道它可以更容易地完成)
你应该可以做类似的事情
TableColumn<Item, Number> averageRatingColumn = new TableColumn<>("Average rating");
averageRatingColumn.setCellValueFactory(cellData ->
new SimpleDoubleProperty(averageRate(cellData.getValue().getId()));
但请注意,这是非常低效的:由于您的 averageRate(...)
方法每次被调用时都会创建一个数据库查询,因此每次更新 table 中的任何行时都会查询数据库,也就是说,只要用户在 table.
中滚动,它就会执行多个数据库查询
因为您的 Item
class 中已经有了 List<Rating>
(这是急切填充的),这样做效率更高,例如:
TableColumn<Item, List<Rating>> averageRatingColumn = new TableColumn<>("Average Rating");
averageRatingColumn.setCellValueFactory(cellData ->
new SimpleObjectProperty<>(cellData.getValue().getRatingList()));
averageRatingColumn.setCellFactory(col -> new TableCell<>() {
@Override
public void updateItem(List<Rating> ratings, boolean empty) {
super.updateItem(ratings, empty);
if (empty || ratings == null) {
setText("");
} else if (ratings.isEmpty()) {
setText("No ratings");
} else {
double average = ratings.stream().collect(
Collectors.averagingInt(Rating::getMark));
setText(String.format("%.2f", average));
}
}
});
我有 class 项(名称、ID、数量等)和 class 评级。每个项目都有评级表。我制作了计算产品平均值的函数(通过取 item_id),并且我有带项目的 TableView。现在我有两个问题。我必须将该平均值添加到 TableView(作为新的 Columny "Average"),然后使每个产品都有其平均值(当函数采用 item_id 时这是问题,但它必须这样做)。
项目class:
public class Item implements Serializable {
static int idCounter=0;
@Id
@Column(name = "car_id") // Mam swiadomosc
@GeneratedValue(generator = "increment")
@GenericGenerator(name="increment", strategy ="increment")
int id;
@Column(name = "item_name",length = 100,nullable =false)
String name;
@Enumerated(EnumType.STRING)
@Column(name = "Item_status", length = 100, nullable = false)
Itemstatus status;
@Column(name = "weight")
double weight;
@Column(name = "amount")
public int amount;
@Column(name = "price")
double price;
@Column(name = "WH_name",length = 100,nullable = false)
String WHname;
transient public int bought = 0;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name="car_id")
public List<Rating> RatingList=new ArrayList<>();
TableView+ 项目列表:
private ObservableList<Item> getItem() {
ObservableList<Item> items=FXCollections.observableArrayList();
FulfillmentCenter F1 = FulfillmentCenterContainer.search( comboBox.getValue());
if(!comboBox.getValue().equals("dowolny"))
items=FXCollections.observableArrayList(F1.ProductList);
else
for(int i = 0; i< FulfillmentCenterContainer.WareHouseList.size(); i++){
items.addAll(FulfillmentCenterContainer.WareHouseList.get(i).ProductList);
}
return items;
}
private TableView<Item> getTable(){
TableColumn<Item,String> column1 = new TableColumn<>("Name of Item");
column1.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<Item,String> column5 = new TableColumn<>("Status of Item");
column5.setCellValueFactory(new PropertyValueFactory<>("status"));
TableColumn<Item, Double> column2 = new TableColumn<>("Price in $");
column2.setCellValueFactory(new PropertyValueFactory<>("price"));
TableColumn<Item, Double> column6 = new TableColumn<>("Weight");
column6.setCellValueFactory(new PropertyValueFactory<>("weight"));
TableColumn<Item,Integer> column7 = new TableColumn<>("Amount of Item");
column7.setCellValueFactory(new PropertyValueFactory<>("amount"));
TableColumn<Item,String> column4 = new TableColumn<>("Name of Warehouse");
column4.setCellValueFactory(new PropertyValueFactory<>("WHname"));
TableColumn<Item,Integer> column3 = new TableColumn<>("ID of Item");
column3.setCellValueFactory(new PropertyValueFactory<>("id"));
tableView=new TableView<>();
tableView.setItems(getItem());
tableView.getColumns().addAll(column1,column2,column3,column4,column5,column6,column7);
pane.getChildren().add(tableView);
tableView.setMinWidth(643);
GridPane.setConstraints(tableView,0,0,1,10);
addButtonToTable();
tultip(tableView);
getList();
return tableView;
}
dowolny= 任何 并获得评级功能:
public double averageRate(int item_id){
Session session = sessionFactory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Integer> criteria = builder.createQuery( Integer.class );
Root<Rating> root = criteria.from( Rating.class );
criteria.select(root.get("mark"));
criteria.where( builder.equal( root.get( "car_id" ), item_id ) );
List<Integer> ratingList=session.createQuery(criteria).getResultList();
double average=0;
double counter=0;
for( Integer integer: ratingList) {
//if(idList.get(0))
average += integer;
counter++;
}
if(counter!=0)
return average/counter;
else
return 0;
}
我必须使用标准来获取它(我知道它可以更容易地完成)
你应该可以做类似的事情
TableColumn<Item, Number> averageRatingColumn = new TableColumn<>("Average rating");
averageRatingColumn.setCellValueFactory(cellData ->
new SimpleDoubleProperty(averageRate(cellData.getValue().getId()));
但请注意,这是非常低效的:由于您的 averageRate(...)
方法每次被调用时都会创建一个数据库查询,因此每次更新 table 中的任何行时都会查询数据库,也就是说,只要用户在 table.
因为您的 Item
class 中已经有了 List<Rating>
(这是急切填充的),这样做效率更高,例如:
TableColumn<Item, List<Rating>> averageRatingColumn = new TableColumn<>("Average Rating");
averageRatingColumn.setCellValueFactory(cellData ->
new SimpleObjectProperty<>(cellData.getValue().getRatingList()));
averageRatingColumn.setCellFactory(col -> new TableCell<>() {
@Override
public void updateItem(List<Rating> ratings, boolean empty) {
super.updateItem(ratings, empty);
if (empty || ratings == null) {
setText("");
} else if (ratings.isEmpty()) {
setText("No ratings");
} else {
double average = ratings.stream().collect(
Collectors.averagingInt(Rating::getMark));
setText(String.format("%.2f", average));
}
}
});