2012-08-22 14 views
7

मैं अपने टेबल डेटा को प्रदर्शित करने के लिए javafx तालिका दृश्य नियंत्रण का उपयोग कर रहा हूं। अब डेटा काफी बड़ा है और जब मैं नियंत्रण में पूरा डेटा दिखाता हूं तो यह दुर्घटनाग्रस्त हो जाता है। ऐसा करने का कोई तरीका है या मुझे डेटा कैश करना होगा ताकि मैं इसे हिस्सों में प्रदर्शित कर सकूं। क्या मुझे इसके बजाय जेटीबल का उपयोग करना चाहिए?जावाएफएक्स तालिका दृश्य प्रदर्शन समस्या

+2

टेबल व्यू पेजिनेशन को लागू करें और भाग में डेटा लोड करें। –

+0

क्या कोई पुस्तकालय या एपीआई पहले से विकसित है जो जावा या जावाएफएक्स में ऐसा करता है? – AsG

+0

स्विंग के लिए शायद तीसरी पार्टी एपिस हो सकती है, लेकिन AFAIK जावाफैक्स के लिए नहीं है। यह वास्तव में आपके पर्यावरण पर निर्भर करता है। उदाहरण के लिए, जेपीए में एक पेजिनेटेड पूछताछ आदि है। दृश्य भाग को लागू करना इतना कठिन नहीं है। –

उत्तर

0

मुझे पूरा यकीन नहीं है कि मैं आपके प्रश्न को सही समझता हूं, लेकिन वस्तुओं की आलसी लोडिंग के बारे में क्या? असल में example within the Docs directly है। हालांकि यह TreeView के लिए है और TableView के लिए नहीं, आप केवल विचार को अनुकूलित करने में सक्षम होना चाहिए।

आशा है कि कम से कम मेरे TreeView के लिए, इससे अब तक कई समस्याएं हल हो गई हैं।

चीयर्स, Regine

+0

धन्यवाद, मैं इसके माध्यम से जाऊंगा ... – AsG

3

मैं एक आलसी लोड tableview पर CellFactory वर्ग का उपयोग किया ... मैं समझाने की कोशिश, बेहतर अंग्रेज़ी के साथ किसी की तुलना में मेरा संपादित करें और इसे और अधिक समझ में आता है करने के लिए स्वतंत्र गिर गया!

सबसे पहले मैं बीन में एक अनिवार्य संपत्ति का उपयोग यह जांचने के लिए करता हूं कि वह बीन पहले ही लोड हो चुका है या नहीं। इस तरह मुझे इसके लिए विशेष रूप से एक विशेषता बनाने की आवश्यकता नहीं है।

दूसरा, मैंने टेबल आईडी को अपने आईडी संग्रह में लोड किया है, बस 'आईडी' प्रॉपर्टी लोड के साथ, जो मेरी तालिका को खाली में दिखाता है।

आखिरकार, मैं नीचे एक जैसा सेलफैक्टरी बना रहा हूं, यह जांचने के लिए कि ऑब्जेक्ट लोड हो गया है या नहीं, और यदि अब यह नहीं किया जाता है।

namecolumn.setCellFactory(new Callback<TableColumn<PersonBean, String>, TableCell<PersonBean, String>>() { 
@Override 
    public TableCell<PersonBean, String> call(TableColumn<PersonBean, String> param) { 
    TableCell<PersonBean, String> newtablecell = new TableCell<PersonBean, String>() { 
     @Override 
     protected void updateItem(String item, boolean empty) { 
     // Since I got some strange errors when method getIndex() return greatter value than my collection size, I need to validate before getting the object 
     if (getIndex() < getItems().size()) { 
      //Retrieve the collection object 
      PersonBean personbean = getItems().get(getIndex()); 
      // Name is mandatory, so if it is null my bean was not loaded yet 
      if (personbean.getName() == null) { 
      // Call other centralized method to make load, details explained later 
      loadPersonBean(personbean); 
      } 
      // Now I put the value on TableCell. Remember "item" still empty so we need to use Bean 
      setText(personbean.getName()); 
      setAlignment(Pos.CENTER); 
     } 
     } 
    }; 
    return newtablecell; 
    } 
}); 
विधि loadPersonBean मैं वस्तु tableview संग्रह में निहित गुजरती हैं और डेटाबेस से इसे लोड में

। तालिका से प्राप्त बीन को सभी आवश्यक डेटा कॉपी करने की तुलना में। मैंने टेबल व्यू में ऑब्जेक्ट को स्वैप करने का प्रयास नहीं किया, लेकिन मुझे विश्वास है कि यह एक समवर्ती अपवाद का परिणाम हो सकता है।

अन्य अवलोकन: मेरे सभी परीक्षणों में टेबलव्यू हमेशा मेरे सेलफैक्टरी को कॉल करने के लिए कॉलम ऑर्डर का सम्मान करता है, लेकिन अगर मैंने कॉलम ऑर्डर को स्वैप किया तो यह अभी भी ऑर्डर का सम्मान नहीं करता है। इसलिए मैं सभी स्तंभों में कोड के "LazyLoadCheck" भाग के साथ एक सेलफैक्टरी जोड़ना पसंद करता हूं।

आशा है कि मैंने मदद करने के लिए पर्याप्त रूप से स्पष्ट किया है! यदि कोई प्रश्न बनी हुई है, तो टिप्पणी करें और मैं बेहतर स्पष्टीकरण करने की कोशिश करूंगा।