Добавить новый столбец в TableView - JAVA FX - PullRequest
0 голосов
/ 17 июня 2020

У меня есть предмет класса (имя, идентификатор, количество и т. Д. c) и рейтинг класса. У каждого предмета есть рейтинг. Я сделал функцию, которая рассчитывает среднее значение для продукта (взяв item_id), и у меня есть TableView с элементами. Теперь у меня 2 проблемы. Я должен добавить это среднее значение в TableView (как новый Columny "Average"), а затем сделать так, чтобы каждый продукт имел свое среднее значение (это проблема, когда функция принимает item_id, но должна).

Класс элемента:

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 = any And fun c, чтобы получить рейтинг:

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;
}

Я ДОЛЖЕН использовать критерии, чтобы получить это (я знаю, что это можно было бы сделать проще)

1 Ответ

0 голосов
/ 17 июня 2020

Вы должны иметь возможность делать что-то вроде

TableColumn<Item, Number> averageRatingColumn = new TableColumn<>("Average rating");
averageRatingColumn.setCellValueFactory(cellData -> 
    new SimpleDoubleProperty(averageRate(cellData.getValue().getId()));

Но обратите внимание, что это невероятно неэффективно: поскольку ваш метод averageRate(...) создает запрос к базе данных каждый раз, когда он вызывается, он будет запрашивать базу данных каждый раз. при обновлении любой строки в таблице, т.е. он будет выполнять несколько запросов к базе данных каждый раз, когда пользователь прокручивает таблицу.

Поскольку у вас уже есть List<Rating> в вашем Item классе (который с нетерпением заполняется ), это намного эффективнее, например:

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));
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...