2011-11-23 12 views
5

मैं अपने मॉडल द्वारा समर्थित सूर्य के उदाहरण JTreeTable के थोड़ा संशोधित संस्करण का उपयोग कर रहा हूं। यह तीसरा उदाहरण होगा (बुकमार्क http://java.sun.com/products/jfc/tsc/articles/bookmarks/ पर)।JTreeTable डीएनडी पागल ब्लिंकिंग ड्रॉप कर्सर

सब कुछ ड्रैग और ड्रॉप समर्थन को छोड़कर अपेक्षित काम करता है। मैं डीएनडी चाहता था जो JTree प्रदान करता है। चूंकि JTreeTable एक विस्तारित JTable है, यह JTable.DropLocation कक्षा को ड्रॉप स्थानों को निर्धारित करने के लिए प्रदान करता है जो JTreeTable (कोई पथ और कोई बाल अनुक्रमणिका) के पेड़ प्रदान किए गए कॉलम में सामान छोड़ते समय पर्याप्त जानकारी प्रदान नहीं करता है। मैंने पहले ही हल कर लिया है कि एक कस्टम DropLocation कक्षा बनाकर जो JTable और JTree संस्करणों के संयोजन पर आधारित है। मैंने TreeTableCellRenderer कक्षा की पेंट विधि को भी संशोधित किया है जो उपयोगकर्ता को यह नई जानकारी दिखाने के लिए उल्लिखित JTreeTable कार्यान्वयन द्वारा प्रदान किया गया है (अब वह यह देखने में सक्षम है कि चयनित नोड के पहले या बाद में नया नोड रखा जाएगा या नहीं यदि पेड़ कॉलम के अंदर, जैसा कि आप JTree से अपेक्षा करेंगे)।

हालांकि एक समस्या है। पेड़ कॉलम के अंदर ड्रॉप स्थान प्रदान किए जाने पर माउस कर्सर पागल हो रहा है। ऐसा प्रतीत होता है और फिर बाद में कुछ मिलीसेकंड गायब हो जाता है या यह इतना तेज़ होता है कि ड्रैग कर्सर भी दिखाया नहीं जाता है। यह असम्बद्ध सूर्य के उदाहरण के साथ भी होता है। मैं अंधेरे में पूरी तरह से हूं कि यह क्यों हो रहा है। http://www.java.net/node/663106 पर एक ही समस्या के साथ एक और व्यक्ति मिला, लेकिन वहां प्रदान किया गया समाधान घटक के ड्रॉप स्थान को शून्य पर सेट करता है और JTreeTable.getDropLocation() विधि का उपयोग करके पुनर्प्राप्त नहीं किया जा सकता है। मुझे इसे अपने संशोधित DropLocation में बदलने के लिए इसकी आवश्यकता है और उसके बाद सामग्री को पेंट करें। मैं अपने उपयोग के मामले के लिए उचित समाधान के बहुत करीब हूं कि मैं इसका स्वाद ले सकता हूं। यह कर्सर झपकी बात मेरे रास्ते में एकमात्र बाधा है। कोई विचार?

जावा 1.6 का उपयोग करना।

पुनश्च: मैं क्योंकि वे सब दिखाई (Netbeans रेखांकित करें या JXTreeTable) की तरह मौजूदा घटकों में से एक JTable.DropLocation समस्या से पीड़ित होने के लिए एक कस्टम JTreeTable और नहीं करने के लिए तय कर लिया है और पहले या बाद में छोड़ने के लिए सहायता प्रदान नहीं करते चयनित पेड़ नोड (केवल अंदर)। यदि आप ऐसे घटक के बारे में जानते हैं जो ऐसी कार्यक्षमता प्रदान करता है तो मुझे इसके बारे में सुनकर खुशी होगी।

+1

इस सवाल का पोस्ट स्क्रिप्टम में मैं गलत आरोप लगा 'org.netbeans.swing.Outline' और' JXTreeTable' से पहले या चयनित पेड़ नोड के बाद छोड़ने समर्थन करने में सक्षम नहीं किया जा रहा की । यह सच नहीं है क्योंकि ये घटक वास्तव में इसका समर्थन करते हैं। वे दोनों परोक्ष रूप से एक जेटीबल subclass। हालांकि यह सच है कि 'JTable.DropLocation' पथ जानकारी प्रदान नहीं करता है, आप इसे हमेशा तालिका पंक्ति और कॉलम के माध्यम से प्राप्त कर सकते हैं जो इसके द्वारा प्रदान किया जाता है। अगर मुझे यह पता होता, तो मैंने कभी भी अपना खुद का घटक रोलिंग नहीं किया होता। मैं इसके खिलाफ सलाह देता हूं। वास्तव में – predi

उत्तर

7

जो कोर बग #6700748 के एक अभिव्यक्ति की तरह लगता है (सत्यापित नहीं कर सकता है कि डर्न बग परेड से कनेक्ट होने में आयु लगती है ..)। तो JXTreeTable में ठीक से हवाला देते हुए:

/** 
    * {@inheritDoc} <p> 
    * 
    * Overridden to hack around #766-swingx: cursor flickering in DnD 
    * when dragging over tree column. This is a core bug (#6700748) related 
    * to painting the rendering component on a CellRendererPane. A trick 
    * around is to let this return false. <p> 
    * 
    * This implementation applies the trick, that is returns false always. 
    * The hack can be disabled by setting the treeTable's client property 
    * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
    * 
    */ 
    @Override 
    public boolean isVisible() { 
     return shouldApplyDropHack() ? false : super.isVisible(); 
    } 


    /** 
    * Returns a boolean indicating whether the drop hack should be applied. 
    * 
    * @return a boolean indicating whether the drop hack should be applied. 
    */ 
    protected boolean shouldApplyDropHack() { 
     return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY)); 
    } 
+0

। यह सही जवाब है। TreeTableCellRenderer.isVisible() को ओवरराइड करना हमेशा झूठी वापसी करने के लिए चाल करता है। – predi

संबंधित मुद्दे