2012-04-17 10 views
5

तो मैं JTable के साथ काम कर रहा हूं, जो कि मेरे अपने कस्टम डेटा मॉडल से जुड़ा हुआ है। यह सब कुछ कार्यात्मक है, लेकिन मेरी समस्या यह है कि जब भी मैं तालिका में परिवर्तन करता हूं (फायरिंग टेबलडेटा चेंज, टेबलस्ट्रक्चर चेंज, इत्यादि) कॉलम चौड़ाई सभी डिफ़ॉल्ट मानों को रीसेट कर देती है। मैं शोध से समझता हूं कि इसे डिफ़ॉल्ट रूप से TableColumnModel के साथ असाइन करना है। इस रीसेटिंग के बाहर, मैं DefaultTableColumnModel की कार्यक्षमता से खुश हूं, लेकिन यदि उपयोगकर्ता को उनका आकार बदलना चाहिए (कॉलम हेडर के किनारे को खींचकर) मैं कॉलम की चौड़ाई को बनाए रखना चाहूंगा।मैं जेटीबल में उपयोगकर्ता-निर्दिष्ट कॉलम चौड़ाई कैसे रख सकता हूं?

मैं TableColumns के लिए setPreferredWidth() के बारे में पता कर रहा हूँ, और मुझे लगता है कि ऐसा करने के लिए सफलतापूर्वक कर लिया है; मुझे लगता है कि मेरा सवाल यह है कि इस पसंदीदा चौड़ाई को बचाने और सेट करने के लिए मुझे किस प्रकार की घटना सुननी चाहिए। मैंने तालिका शीर्षलेख में PropertyChangeListener जोड़ने का प्रयास किया, लेकिन जब भी मैंने आकार बदलने का प्रयास किया तो मुझे एक स्टैक ओवरफ्लो मिलेगा (मुझे लगता है कि यह पुनरावर्ती चल रहा था)। कॉलम चौड़ाई के लिए डेटा मॉडल में एक अतिरिक्त डेटा सदस्य जोड़ने और इसे वहां संग्रहीत करने के साथ मैं बिल्कुल ठीक हूं, लेकिन मुझे नहीं पता कि इन चौड़ाई को कब/कैसे सेट किया जाए ताकि उन्हें fireTableStructureChanged() द्वारा ओवरराइड नहीं किया जा सके, आदि घटनाओं। विचार?

+1

इससे पहले कि आप अपने प्रक्रिया को बंद, स्तंभ चौड़ाई पढ़ सकते हैं और उन्हें एक गुण को बचाने के लिए फ़ाइल। जब आप अपनी प्रक्रिया खोलते हैं, गुण फ़ाइल पढ़ें और, यदि यह मौजूद है, तो स्तंभ चौड़ाई निर्धारित करें। आपको DefaultTableColumnModel का विस्तार करने की आवश्यकता हो सकती है ताकि आप कॉलम चौड़ाई को नियंत्रित कर सकें। –

+0

यह वास्तव में fireTableStructureChanged (के लिए किसी भी कॉल में यह करता है) ही नहीं, कार्यक्रम के शुरू में है, इसलिए यदि मैं डाटा मॉडल (जहां यह कॉलम पुनर्जीवित करने के लिए है) में कॉलम जोड़ें या हटाएं यह ऐसा करता है। मैंने कॉलम चौड़ाई मैन्युअल रूप से सेट करने के लिए 'fireTableStructureChanged()' को ओवरराइड करने का प्रयास किया है, लेकिन ऐसा प्रतीत होता है कि इसका कोई प्रभाव नहीं है। मुझे लगता है कि मुझे यकीन नहीं है कि यह कॉलम पीढ़ी कहां हो रही है और इसे कहां ओवरराइड किया जाए। – kcoppock

+0

मैंने हमेशा डेटा संचालित कॉलम चौड़ाई पूरी की है। अगर मुझे कुछ मिल जाए, तो मैं एक जवाब दूंगा। –

उत्तर

1

इस तरह कुछ कोशिश करें।

import javax.swing.JTable; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class ColumnResizer { 

    public static void setColumnPreferredWidth(JTable table, int column, 
      int preferredWidth) { 
     TableColumnModel columnModel = table.getColumnModel(); 
     TableColumn tableColumn = columnModel.getColumn(column); 
     tableColumn.setPreferredWidth(preferredWidth); 
    } 

} 
+0

मुझे विचार पसंद है, और यह काम करता है, लेकिन केवल तब तक जब तक कि अगले संरचना में बदलाव न हो। यह मुझे सही रास्ते पर मिला, हालांकि, और अब मुझे एहसास हुआ है कि यह सब 'TableColumnModel' की 'addColumn()' विधि में होता है। मैं यहां स्रोत स्थापित करता हूं: http://fuseyism.com/classpath/doc/javax/swing/table/DefaultTableColumnModel-source.html और वहां 'कॉलम.सेट प्रीपेरर्डविड्थ()' जोड़ने के लिए ओवरराइड कर रहा हूं। मैं अपने डेटा मॉडल में एक संदर्भ जोड़ूंगा ताकि यह आवश्यकतानुसार कॉलम चौड़ाई प्राप्त कर सके और सेट कर सके, और इसे वहां संभाल लें। धन्यवाद! – kcoppock

1

क्या

के बारे में

table.setAutoCreateColumnsFromModel(false);

मैं भी इस समस्या थी, यह मेरे लिए काम किया!

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

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