2009-09-29 24 views
30

के लिए जेटीबल अदृश्य में कॉलम कैसे बनाएं मैंने एक जीयूआई डिज़ाइन किया है जिसमें मैंने एक जेटीबल का उपयोग किया है जिससे मुझे 2 कॉलम अदृश्य बनाना है। मैं कैसे करूं ?स्विंग जावा

उत्तर

-4

सेट मिनट, अधिकतम और "सामान्य" चौड़ाई 0 पर:

jTable.getColumn("ABC").setWidth(0); 
jTable.getColumn("ABC").setMinWidth(0); 
jTable.getColumn("ABC").setMaxWidth(0); 

दूसरा दृष्टिकोण TableColumnModel का विस्तार करने और (JTable के लिए) भ्रम पैदा करने के सभी तरीकों को ओवरराइड कि अपने मॉडल नहीं करता है 'करने के लिए है उन दो कॉलम नहीं है।

तो जब आप कॉलम छुपाते हैं, तो तालिका को कॉलम की संख्या के लिए पूछने पर आपको एक बार वापस लौटना होगा और जब यह कॉलम एक्स के लिए पूछता है, तो आपको कॉलम इंडेक्स में +1 जोड़ना पड़ सकता है (इसके आधार पर छिपे हुए कॉलम के बाएं या दाएं), आदि

अपने नए टेबल मॉडल को वास्तविक कॉलम मॉडल में सभी विधि कॉल (सही इंडेक्स आदि के साथ) आगे बढ़ने दें और जेटीबल में नए टेबल मॉडल का उपयोग करें।

+0

नहीं, यह काम नहीं करता है। –

+0

आपको न्यूनतम और अधिकतम चौड़ाई भी सेट करनी होगी। –

+0

आदेश क्यों महत्वपूर्ण है, मैंने इसे पहले कोशिश की और मैंने उसी क्रम का उपयोग नहीं किया, इसलिए यह काम नहीं करता है, ओईसी मैंने उसी क्रम (चौड़ाई, न्यूनतम, अधिकतम) का उपयोग किया है, तो क्यों? –

-2

आप मॉडल की एक उपवर्ग बना सकते हैं, और TableModel.getColumnCount ओवरराइड इस प्रकार है:

int getColumnCount() { 
    return super.getColumnCount()-2; 
} 

अंतिम दो कॉलम तो JTable में प्रदर्शित नहीं किया जाएगा।

+0

लेकिन क्या मैं उनसे डेटा प्राप्त कर सकता हूं? –

+0

आप केवल भ्रम पैदा कर रहे हैं कि कॉलम नहीं हैं, लेकिन अभी भी वहां हैं और इस प्रकार डेटा को अभी भी प्राप्त करने में सक्षम होना चाहिए – dharga

+0

लेकिन मुझे उन्हें GUI से कैसे छिपाना चाहिए। –

54

TableColumnModel से हटाएं।

TableColumnModel tcm = table.getColumnModel(); 
tcm.removeColumn(tcm.getColumn(...)); 

यदि आपको डेटा तक पहुंच की आवश्यकता है तो आप table.getModel().getValueAt(...) का उपयोग करें।

एक और जटिल समाधान के लिए जो उपयोगकर्ता को कॉलम को छुपाने/दिखाने की अनुमति देता है क्योंकि वे Table Column Manager देखें।

+2

यह करने का यह सही तरीका है - चौड़ाई को 0 पर सेट करना बोगस है। इस तरह आपके पास अभी भी आपके मॉडल में डेटा है; आप सिर्फ दृश्य का हिस्सा छुपा रहे हैं। – M1EK

+4

उपरोक्त दृष्टिकोण के साथ भी डेटा मॉडल में अभी भी है, यही कारण है कि आप इसे ऊपर दिखाए गए अनुसार एक्सेस कर सकते हैं। एमवीसी कैसे काम करता है। हम जो भी कर रहे हैं वह दृश्य बदल रहा है। जब आप चौड़ाई को 0 पर सेट करते हैं, तो टैबबिंग आज़माएं, जब आप छुपा कॉलम फ़ोकस दबाते हैं तब तक गायब हो जाते हैं जब तक आप दोबारा टैब नहीं करते। यह उपयोगकर्ताओं को भ्रमित करेगा। – camickr

+0

आपको बहुत बहुत धन्यवाद। इसने मुझे बहुत मदद की ......... – Geetanjali

12

मैंने दो संभावित समाधानों की कोशिश की जो दोनों काम करते हैं, लेकिन पहले समाधान के साथ कुछ समस्या मिली।

table.removeColumn(table.getColumnModel().getColumn(4)); 

या

table.getColumnModel().getColumn(4).setMinWidth(0); 
    table.getColumnModel().getColumn(4).setMaxWidth(0); 
    table.getColumnModel().getColumn(4).setWidth(0); 

मेरी हाल ही में मामले में, मुझे 2 समाधान को प्राथमिकता दी क्योंकि मैं एक TableRowSorter गयी।

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
    table.setRowSorter(sorter); 

जब table.removeColumn(table.getColumnModel().getColumn(4)) का उपयोग कर, यह शारीरिक रूप से देखें/तालिका से स्तंभ निकाल देंगे ताकि आप table.getValueAt(row, 4) उपयोग नहीं कर सकते हैं - यह रिटर्न ArrayIndexOutOfBounds। हटाए गए कॉलम का मान प्राप्त करने का एकमात्र तरीका table.getModel().getValueAt(table.getSelectedRow(),4) पर कॉल करना है। TableRowSorter के बाद से प्रकार केवल क्या मेज पर है, लेकिन नहीं DefaultTableModel वस्तु में डेटा, समस्या यह है कि जब आप रिकॉर्ड छँटाई के बाद मूल्य मिलता है - यह DefaultModelObject, जो पृथक नहीं किया जा रहा है से डेटा पुनः प्राप्त होगा ।

तो मैं इस्तेमाल किया 2 समाधान तो इस्तेमाल किया table.getValueAt(table.getSelectedRow(),4);

केवल मुद्दा मैं 2 दृष्टिकोण के साथ देखते हैं @camickr द्वारा उल्लेख किया गया था: "आप 0 करने के लिए चौड़ाई सेट करते हैं, टैब, जब आप छिपा मारा की कोशिश कॉलम फ़ोकस तब तक गायब हो जाता है जब तक आप दोबारा टैब न करें। इससे उपयोगकर्ताओं को भ्रमित कर दिया जाएगा। "

+6

'table.getModel() का उपयोग करें। getValueAt (table.convertRowIndexToModel (पंक्ति), 4)। – xmedeko

-3

मैंने उन सभी की कोशिश की है: वे मदद नहीं करते हैं। कॉलम के बिना एक नया टेबल मॉडल बनाना सबसे अच्छा तरीका है जिसे आप हटाना चाहते हैं। यह तुम कैसे करते है:

table = (DefaultTableModel) <table name>.getModel(); 
DefaultTableModel table1 = new DefaultTableModel(); 
Vector v = table.getDataVector(); 
Vector v1 = newvector(v,<column index you want to delete>); 

Vector newvector(Vector v,int j){ 
    Vector v1= new Vector(); 
    try{ 
     Vector v2; 
     Object[] o = v.toArray(); 
     int i =0; 
     while(i<o.length){ 
      v2 = (Vector) o[i]; 
      v2.remove(j); 
      v1.add(v2); 
      i++; 
     } 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null,"Error in newvector \n"+e); 
    } 
    return v1; 
} 

Vector getColumnIdentifiers(int i) { 
    Vector columnIdentifiers = new Vector(); 
    int j=0; 
    while(j<i){ 
     columnIdentifiers.add(("c"+(j+1))); 
     j++; 
    } 
    return columnIdentifiers; 
} 
table1.setDataVector(v1,getColumnIdentifiers((<column count>-1))); 
<table name>.setModel(table1); 
28

पहला दृश्य

table.removeColumn(table.getColumnModel().getColumn(4)); 

से इस स्तंभ को निकालने फिर मॉडल से डेटा पुनः प्राप्त।

table.getModel().getValueAt(table.getSelectedRow(),4); 

एक बात ध्यान रखें कि जब डेटा पुन: प्राप्त है, यह मॉडल मेज से नहीं से पुनः प्राप्त किया जाना चाहिए है।

+0

मॉडल से कैसे निकालें? – partho

6

मैं एक ही समस्या थी और की वजह से मैं TableColumnModelremovColumn(); उपयोग कर रहा हूँ मेरी मदद does'not तो मैं इस

table.getColumnModel().getColumn(0).setWidth(0); 
table.getColumnModel().getColumn(0).setMinWidth(0); 
table.getColumnModel().getColumn(0).setMaxWidth(0); 

इस्तेमाल किया और मेरे लिए ठीक काम किया यह अभी भी एक स्तंभ 0 छिपाने के लिए और मैं मूल्य प्राप्त करने में सक्षम इससे

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