मैं अपने जावाएफएक्स ऐप में अपने टेबल व्यू में डेटा जोड़ने की कोशिश कर रहा था। मैं अपने डेटाबेस पर संचालन करने के लिए हाइबरनेट का उपयोग कर रहा हूं। मैंने सभी ऑर्डर प्राप्त करने और प्रत्येक ऑर्डर को किसी ऑब्जेक्ट में संग्रहीत करने के लिए एक क्वेरी का उपयोग किया और ऑब्जेक्ट को तालिका दृश्य की देखने योग्य सूची में जोड़ा। मैंने ऑर्डर क्लास बनाया और इसे अपने डेटाबेस में मैप किया। यह आदेशों का वर्ग है:

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



}

और नीचे दिया गया कोड उस दृश्य का कोड है जिसमें मेरे पास तालिका दृश्य है जो ऑर्डर लोड करता है और डेटाबेस से ऑर्डर प्रदर्शित करता है:

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 विधि वह विधि है जो डेटाबेस से ऑर्डर प्राप्त करती है और तालिका दृश्य की देखने योग्य सूची सेट करती है।

मुझे ऑर्डर के item_id और user_id को प्रदर्शित करने में समस्या हो रही है। मुझे लगता है कि समस्या यह है कि वे दोनों क्रमशः वस्तुओं और उपयोगकर्ताओं की वस्तुएं हैं और तालिका वस्तुओं का पता प्रदर्शित करती है। इसके बजाय मैं ऑर्डर किए गए आइटम की आईडी और ऑर्डर करने वाले उपयोगकर्ता की संख्या प्रदर्शित करना चाहता हूं। यदि आप जानते हैं कि मैं अपनी समस्या को ठीक करने के लिए क्या कर सकता हूं तो कृपया इसे मेरे साथ साझा करें।

0
Gabriel Chammas 17 अप्रैल 2020, 22:54
कोशिकाओं को उत्पन्न करने के लिए सेल फ़ैक्टरी का उपयोग करें जो वस्तुओं को आपकी इच्छानुसार प्रदर्शित करते हैं। यह उदाहरण दिखाता है कि किसी संख्या को कैसे प्रारूपित किया जाए, लेकिन आप यह कर सकते हैं टेबल सेल में टेक्स्ट को किसी भी वैल्यू पर सेट करने के लिए उसी तकनीक का उपयोग करें जो आपको उस सेल के डेटा से प्राप्त हो।
 – 
James_D
17 अप्रैल 2020, 22:59
2
थोड़ा हटकर विषय; कृपया उचित जावा नामकरण परंपराओं का उपयोग करें - यह कोड फ़ॉर्मेटर को हाइलाइट करने में सक्षम करेगा आपका कोड सही ढंग से (जैसे वर्ग के नाम), जावा प्रोग्रामर के लिए पढ़ना आसान बनाता है, और (चूंकि मैं अनुमान लगा रहा हूं कि आप अपने सेल वैल्यू कारखानों के लिए PropertyValueFactorys का उपयोग कर रहे हैं) पुस्तकालयों में उपयोग किए जाने पर यह कम छोटी गाड़ी होगी जावाएफएक्स की तरह।
 – 
James_D
17 अप्रैल 2020, 23:01

2 जवाब

प्रासंगिक कॉलम में cellFactorys जोड़ें। आपने प्रश्न में FXML नहीं दिखाया है, इसलिए मुझे आपके द्वारा उपयुक्त 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();
    }  
}
1
James_D 17 अप्रैल 2020, 23:15

users और items कक्षाओं में बस toString विधि को ओवरराइड करें:

उदाहरण: आपकी users कक्षा में ->

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

जैसा कि James_D ने कहा है, जावा सम्मेलनों पर एक नज़र डालें। जावा क्लासेस हमेशा कैपिटल लेटर के साथ होनी चाहिए।

-2
smithnblack 17 अप्रैल 2020, 23:01
2
यह बेहद खराब सलाह है। आपको अन्य उद्देश्यों (विशेष रूप से डिबगिंग के लिए) के लिए toString() विधि की आवश्यकता हो सकती है, जिसका इससे कोई लेना-देना नहीं है कि आप UI में डेटा कैसे प्रदर्शित करना चाहते हैं।
 – 
James_D
17 अप्रैल 2020, 23:04
मुझे लगता है कि यह उनके कोड के लिए सबसे आसान समाधान है। बहुत बुरा आपने अभी इसे कम कर दिया है! अगर हम बात कर रहे हैं कि क्या अच्छा है और क्या नहीं, तो इसका कोई मतलब नहीं है कि user_id नामक वेरिएबल है जो कि प्रकार से है users
 – 
smithnblack
17 अप्रैल 2020, 23:10
2
यदि आप मॉडल वर्ग (toString() विधि) में विधियों को डिज़ाइन करते हैं, तो आप UI से डेटा को अलग करने के उद्देश्य को नष्ट कर देते हैं कि UI को डेटा कैसे प्रदर्शित करना चाहिए। डाउनवोटिंग व्यक्तिगत नहीं है, मैं केवल भविष्य के उपयोगकर्ताओं को उप-इष्टतम समाधानों का उपयोग करने से रोकने की कोशिश कर रहा हूं।
 – 
James_D
17 अप्रैल 2020, 23:14
आवेदन कारणों से tostring को ओवरराइड करना गलत है, जैसा कि @James_D ने पहले ही नोट किया है: बस किसी विशेष वस्तु को अलग-अलग आवश्यकताओं के साथ अलग-अलग विचारों में देखने के बारे में सोचें ..
 – 
kleopatra
18 अप्रैल 2020, 00:52