Не удается правильно отобразить данные в tableView в JavaFX - PullRequest
0 голосов
/ 17 апреля 2020

Я пытался добавить данные в свой tableView в моем приложении JavaFX. Я использую Hibernate для выполнения операций над моей базой данных. Я использовал запрос, чтобы получить все заказы и сохранить каждый заказ в объекте и добавил объект в наблюдаемый список tableView. Я создал класс заказов и сопоставил его с моей базой данных. Это класс заказов:

@Entity
@Table(name = "orders")
public class orders implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_id")
    private int order_id;

    @JoinColumn(name = "item_id")
    @ManyToOne
    @NotNull
    private items item_id;

    @Column(name = "quantity")
    @NotNull
    private int quantity;

    @Column(name = "price_per_unit")
    @NotNull
    private double price_per_unit;

    @Column(name = "total_price")
    @NotNull
    private double total_price;

    @Column(name = "order_date")
    @NotNull
    private Date order_date;

    @JoinColumn(name = "user_id")
    @ManyToOne
    @NotNull
    private users user_id;

    public orders() {
    }

    public orders(int order_id, items item_id, int quantity, double price_per_unit, double total_price, Date order_date, users user_id) {
        this.order_id = order_id;
        this.item_id = item_id;
        this.quantity = quantity;
        this.price_per_unit = price_per_unit;
        this.total_price = total_price;
        this.order_date = order_date;
        this.user_id = user_id;
    }

    public int getOrder_id() {
        return order_id;
    }

    public void setOrder_id(int order_id) {
        this.order_id = order_id;
    }

    public items getItem_id() {
        return item_id;
    }

    public void setItem_id(items item_id) {
        this.item_id = item_id;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPrice_per_unit() {
        return price_per_unit;
    }

    public void setPrice_per_unit(double price_per_unit) {
        this.price_per_unit = price_per_unit;
    }

    public double getTotal_price() {
        return total_price;
    }

    public void setTotal_price(double total_price) {
        this.total_price = total_price;
    }

    public Date getOrder_date() {
        return order_date;
    }

    public void setOrder_date(Date order_date) {
        this.order_date = order_date;
    }

    public users getUser_id() {
        return user_id;
    }

    public void setUser_id(users user_id) {
        this.user_id = user_id;
    }



}

А приведенный ниже код является кодом представления, в котором у меня есть tableView, который загружает заказы и отображает заказы из базы данных:

public class OrdersPageController implements Initializable {
    private Main app;
    private Session session;
    private Transaction transaction = null;

    @FXML
    private TableView<orders> table;

    public void setApp(Main app) {
        this.app = app;
    }



    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        session = HibernateUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();

        //Fill the table view
        getOrders();
    }  


    public void goBack(ActionEvent event){
        session.close();
        transaction = null;
        app.goToHomePage();
    }

    public void processLogout(ActionEvent event){
        session.close();
        transaction = null;
        app.userLogout();
    }

    public void addOrder(ActionEvent event){
        session.close();
        transaction = null;
        app.addOrdersPage();
    }

    public void deleteOrder(ActionEvent event){
        session.close();
        transaction = null;
        app.closeOrdersPage();
    }

    public void getOrders(){

        try{

            String hql = "FROM orders";
            Query query = session.createQuery(hql);
            List<orders> list = query.getResultList();

            for (orders o : list) {
                //Create an order object
                orders order = new orders();
                order.setOrder_id(o.getOrder_id());
                order.setItem_id(o.getItem_id());
                order.setPrice_per_unit(o.getPrice_per_unit());
                order.setQuantity(o.getQuantity());
                order.setOrder_date(o.getOrder_date());
                order.setTotal_price(o.getTotal_price());
                order.setUser_id(o.getUser_id());

                //Create an observable list for the table
                ObservableList<orders> tableList = table.getItems();
                //Add the order object to the list
                tableList.add(order);
                //Set the created list to the table to show data
                table.setItems(tableList);
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            session.close();
        }

    }

}

Обратите внимание, что метод getOrders - это метод, который получает заказы из базы данных и устанавливает наблюдаемый список tableView.

У меня проблемы с отображением item_id и user_id заказа. Я думаю, что проблема заключается в том, что они оба являются объектами типов элементов и пользователей соответственно, и таблица отображает адрес объектов. Вместо этого я хочу отобразить номера идентификаторов заказанного товара и пользователя, который сделал заказ. Если вы знаете, что я могу сделать, чтобы решить мою проблему, поделитесь со мной.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Добавьте cellFactory s к соответствующим столбцам. Вы не указали F XML в вопросе, поэтому я не знаю имен, которые вы присвоили соответствующим TableColumn экземплярам, ​​но вы можете сделать что-то вроде этого:

public class OrdersPageController implements Initializable {

    // ...

    @FXML
    private TableView<orders> table;

    @FXML
    private TableColumn<orders, users> userColumn ;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        userColumn.setCellFactory(tc -> new TableCell<>() {
            @Override
            protected void updateItem(users user, boolean empty) {
                super.updateItem(user, empty);
                if (empty || user == null) {
                    setText("");
                } else {
                    String text = /* anything you need based on user */
                    setText(text);
                }
            }
        });

        session = HibernateUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();

        //Fill the table view
        getOrders();
    }  
}
0 голосов
/ 17 апреля 2020

Просто переопределить метод toString в users и items Классы:

Пример: в вашем users Классе ->

@Override
public String toString() {
    return user_id.toString();
}

Как указано в James_D, есть посмотрите на java условности. Java Классы всегда должны быть с заглавной буквой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...