Java JTable सेटिंग कॉलम चौड़ाई


95

मेरे पास एक JTable है जिसमें मैंने कॉलम का आकार निम्नानुसार निर्धारित किया है:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);

यह ठीक काम करता है, लेकिन जब तालिका को अधिकतम किया जाता है, तो मुझे अंतिम कॉलम के दाईं ओर खाली जगह मिलती है। क्या यह संभव है कि अंतिम कॉलम आकार बदलने पर विंडो के अंत में बदल जाए?

मुझे AUTO_RESIZE_LAST_COLUMNडॉक्स में संपत्ति मिली, लेकिन यह काम नहीं करता है।

संपादित करें: JTableमें एक है JScrollPaneअपने पसंदीदा आकार निर्धारित है।

जवाबों:


45

क्या होता है अगर आप फोन setMinWidth(400)अंतिम स्तंभ पर बजाय का setPreferredWidth(400)?

JavaDoc के लिए JTable, डॉक्स को doLayout()बहुत ध्यान से पढ़ें । यहाँ कुछ विकल्प बिट्स हैं:

जब एक एन्कोडिंग विंडो के आकार के परिणामस्वरूप विधि को बुलाया जाता है, तो resizingColumn शून्य होता है। इसका मतलब यह है कि आकार बदलने से JTable और परिवर्तन "बाहर" हो गया है - या "डेल्टा" - इस JTable के स्वचालित आकार परिवर्तन मोड की परवाह किए बिना सभी कॉलम में वितरित किया जाना चाहिए।

यह हो सकता है कि AUTO_RESIZE_LAST_COLUMNआपकी मदद क्यों नहीं की।

नोट: जब कोई JTable स्तंभों की चौड़ाई में समायोजन करता है तो यह उनके न्यूनतम और अधिकतम मानों का पूर्ण रूप से सम्मान करता है।

यह कहता है कि आप सभी कॉलमों के लिए मिन == मैक्स सेट करना चाहते हैं, लेकिन फिर मिन = प्रीफर्ड को अंतिम कॉलम पर सेट करें और मैक्स को सेट न करें या मैक्स के लिए बहुत बड़ा मूल्य निर्धारित न करें।


1
setMinWidth (400) अभी भी तालिका के दाईं ओर खाली होने का कारण बनता है
हमजा यरलीकया

2
सेटमैक्सविदथ (10000) को जोड़ने की कोशिश करें कि क्या फर्क पड़ता है।
एडी

1
लाइन टेबल को हटा दें ।setAutoResizeMode (JTable.AUTO_RESIZE_OFF); यह आप चाहते हैं कि आकार बदलने से रोक सकता है।
एडी

आप शायद JTable पर भी न्यूनतम और अधिकतम आकार सेट करना चाहते हैं, यदि आप पहले से ही नहीं है,
एडी

3
सुनिश्चित करें कि आप टेबल मॉडल लागू करने के बाद setMinWidth कॉल करते हैं ... कि थोड़ी देर के लिए मुझे एक बार ट्रिप किया।
ब्रायन नोब्लुक

23

इसके साथ JTable.AUTO_RESIZE_OFF, तालिका आपके लिए किसी भी कॉलम का आकार नहीं बदलेगी, इसलिए यह आपकी पसंदीदा सेटिंग लेगा। यदि कॉलम को अपने पसंदीदा आकार के लिए डिफ़ॉल्ट करना आपका लक्ष्य है, तो अंतिम कॉलम को छोड़कर बाकी फलक को भरने के लिए, आपके पास JTable.AUTO_RESIZE_LAST_COLUMNautoResizeMode का उपयोग करने का विकल्प है , लेकिन यह सबसे प्रभावी हो सकता है जब TableColumn.setMaxWidth()TableColumn के बजाय इसका उपयोग किया जाए । setPreferredWidth () सभी के लिए लेकिन अंतिम कॉलम।

एक बार जब आप संतुष्ट हो जाते हैं कि AUTO_RESIZE_LAST_COLUMNवास्तव में काम करता है, तो आप TableColumn.setMaxWidth()और के संयोजन के साथ प्रयोग कर सकते हैंTableColumn.setMinWidth()


1
जब AUTO_RESIZE_LAST_COLUMN का उपयोग किया जाता है, तो तालिका को स्क्रॉल फलक में फिट करने के लिए आकार परिवर्तन किया जाता है, मेरा लक्ष्य तालिका को कुछ न्यूनतम आकार में रखना है, लेकिन यदि यह मेरे मीनिनम आकार से बड़ा है, तो इसे बड़ा करें।
हमजा येरलिकाया

यदि आप TableColumn.setMaxWidth () के बजाय TableColumn.setMinWidth () का उपयोग करते हैं तो आपके पास यह व्यवहार हो सकता है।
अकफ

मेरी पिछली टिप्पणी में जोड़ने के लिए: अंतिम स्तंभ सहित अपनी तालिका के प्रत्येक स्तंभ के लिए TableColumn.setMinWidth () का उपयोग करें।
अकफ

न्यूनतम और अधिकतम चौड़ाई दोनों को सेट करने से समस्या हल हो गई लेकिन अब स्क्रॉल बार मिस्सिन हैं।
हमजा यारलिकाय

15

JTable.AUTO_RESIZE_LAST_COLUMNको "सभी परिवर्तनों के संचालन के दौरान, अंतिम कॉलम में केवल समायोजन लागू करें" के रूप में परिभाषित किया गया है , जिसका अर्थ है कि आपको अपने कोड के अंत में ऑटोरेस्ज़ीमोड सेट करना होगा , अन्यथा setPreferredWidth () कुछ भी प्रभावित नहीं करेगा!

तो आपके मामले में यह सही तरीका होगा:

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);

5

इस विधि का उपयोग करें

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
}

या JTableकक्षा का विस्तार करें :

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}

और तब

table.setColumnWidths(30, 150, 100, 100);

4

क्लियोपेट्रा की टिप्पणी पढ़ते हुए (उसके दूसरी बार उसने javax.swing.JXTable पर एक नज़र डालने का सुझाव दिया , और अब मुझे खेद है कि मुझे पहली बार एक नज़र नहीं मिला :)) मेरा सुझाव है कि आप लिंक का पालन करें

मेरे पास एक ही समस्या के लिए यह समाधान था: (लेकिन मेरा सुझाव है कि आप ऊपर दिए गए लिंक का पालन करें) तालिका का आकार बदलने पर, तालिका स्तंभ चौड़ाई को वर्तमान तालिका कुल चौड़ाई में स्केल करें। ऐसा करने के लिए, मैं (सापेक्ष) कॉलम चौड़ाई के लिए ints का एक वैश्विक सरणी का उपयोग करता हूं:

private int[] columnWidths=null;

मैं तालिका स्तंभ चौड़ाई सेट करने के लिए इस फ़ंक्शन का उपयोग करता हूं:

public void setColumnWidths(int[] widths){
    int nrCols=table.getModel().getColumnCount();
    if(nrCols==0||widths==null){
        return;
    }
    this.columnWidths=widths.clone();

    //current width of the table:
    int totalWidth=table.getWidth();

    int totalWidthRequested=0;
    int nrRequestedWidths=columnWidths.length;
    int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);

    for(int col=0;col<nrCols;col++){
        int width = 0;
        if(columnWidths.length>col){
            width=columnWidths[col];
        }
        totalWidthRequested+=width;
    }
    //Note: for the not defined columns: use the defaultWidth
    if(nrRequestedWidths<nrCols){
        log.fine("Setting column widths: nr of columns do not match column widths requested");
        totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
    }
    //calculate the scale for the column width
    double factor=(double)totalWidth/(double)totalWidthRequested;

    for(int col=0;col<nrCols;col++){
        int width = defaultWidth;
        if(columnWidths.length>col){
            //scale the requested width to the current table width
            width=(int)Math.floor(factor*(double)columnWidths[col]);
        }
        table.getColumnModel().getColumn(col).setPreferredWidth(width);
        table.getColumnModel().getColumn(col).setWidth(width);
    }

}

मेरे द्वारा कॉल किए जाने वाले डेटा को सेट करते समय:

    setColumnWidths(this.columnWidths);

और बदलने पर मैं मेज के माता-पिता को दिए गए घटक घटक को कॉल करता हूं (मेरे मामले में JScrollPane जो मेरी तालिका का कंटेनर है):

public void componentResized(ComponentEvent componentEvent) {
    this.setColumnWidths(this.columnWidths);
}

ध्यान दें कि जेट टेबल भी वैश्विक है:

private JTable table;

और यहाँ मैंने श्रोता को सेट किया:

    scrollPane=new JScrollPane(table);
    scrollPane.addComponentListener(this);

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

मुझे पता है कि यह उपयोगकर्ता को तालिका की चौड़ाई को मैन्युअल रूप से बदलने पर प्रतिक्रिया नहीं करता है, इस तरह से यह एक हैक है ... लेकिन फिर से: यह ऊपर दिए गए सुझाव से बेहतर है। लेकिन आपने मुझे JXTable के लिए उत्सुक बना दिया .... मुझे वहाँ एक नज़र रखना होगा! (और एक टेबल विषय पर फिर से आपके साथ चलने के लिए अच्छा है :))
michel.iamit

आप सही थे, मेरे जवाब के ऊपर मेरी टिप्पणी देखें, मैंने आपकी टिप्पणी को गलत ठहराया है!
michel.iamit

कम से कम मेरे लिए यह उपयोगी था, मैंने अपने केस के लिए इस दृष्टिकोण का उपयोग कॉलम वेट सिद्धांत के साथ किया।
सोलोस्ट्रान 14

2
fireTableStructureChanged();

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


1

विकल्प की आवश्यकता नहीं है, बस अंतिम कॉलम की पसंदीदा चौड़ाई अधिकतम करें और यह सभी अतिरिक्त स्थान लेगा।

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(Integer.MAX_INT);

0

इस कोड को मेरे बिना setAutoResizeModes के लिए काम किया जाता है।

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);

-1

इस कोड का उपयोग करें। इसने मेरे लिए काम किया। मैंने 3 कॉलम के लिए विचार किया। अपने कोड के लिए लूप मान बदलें।

TableColumn column = null;
for (int i = 0; i < 3; i++) {
    column = table.getColumnModel().getColumn(i);
    if (i == 0) 
        column.setMaxWidth(10);
    if (i == 2)
        column.setMaxWidth(50);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.