2011-05-09 10 views
8

जावा में मैं गतिशील रूप से एक जेटीबल में कॉलम जोड़ने के लिए डिफ़ॉल्टTableModel का उपयोग कर रहा हूं।जावा में टेबलमोडेल से कॉलम को हटा रहा है

//create DefaultTableModel with columns and no rows 
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); 
JTable table = new JTable(tableModel); 

कॉलम नाम परिवर्तक कॉलम नामों के साथ एक स्ट्रिंग सरणी है। तो प्रोग्राम चालू होने और चलाने के बाद उपयोगकर्ता को अतिरिक्त कॉलम जोड़ने का विकल्प होता है। मैं इतनी के रूप में

tableModel.addColumn("New column name"); 

कौन सा गतिशील के रूप में वांछित तालिका में कॉलम जोड़ने पर इस प्रकार से करते हैं। उपयोगकर्ता जोड़े गए कॉलम भी हटा सकता है।

  TableColumn tcol = table.getColumnModel().getColumn(0); 
      table.getColumnModel().removeColumn(tcol); 

हैं कि किसी विशिष्ट सूचकांक में स्तंभ निकाल देना चाहिए, मैं भी कोशिश की है: इस के लिए मैं निम्नलिखित कोड का उपयोग

table.removeColumn(sheet.getColumn(assessmentName)); 

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

उत्तर

6

अपनी मेज के लिए, table.setAutoCreateColumnsFromModel(false);

This post से कॉल करके कैसे स्तंभ और अंतर्निहित डेटा को नष्ट करने के रूप में एक अच्छा उदाहरण है।

+0

+1, setAutoCreateColumnsFromModel() विधि के लिए। यह एक बहुत ही उपयोगी विधि है। – camickr

+0

धन्यवाद उस पोस्ट का लिंक केवल मुझे आवश्यक जानकारी थी – Mark

+0

बहुत बहुत धन्यवाद। सुविधा के बारे में पता नहीं था। – Mark

4

TableColumn स्तर पर कार्य करते हुए, जैसा कि आप दिखाते हैं, केवल एक दृश्य प्रभाव पड़ता है लेकिन TableModel पर कोई प्रभाव नहीं पड़ता है।

तुम सच में DefaultTableModel से एक कॉलम निकालने करना चाहते हैं तो आप इसे उपवर्ग और फिर, अपनी उपवर्ग में करना होगा:

public class MyTableModel extends DefaultTableModel { 
    public void removeColumn(int column) { 
     columnIdentifiers.remove(column); 
     for (Object row: dataVector) { 
      ((Vector) row).remove(column); 
     } 
     fireTableStructureChanged(); 
    } 
} 

मैं इसे की जाँच नहीं की है, लेकिन यह आपके मामले में काम करना चाहिए ।

बेशक, removeColumn() केवल ईडीटी से ही बुलाया जाना चाहिए।

ध्यान दें कि मैं इस तरह के कोड का उत्पादन करने के लिए किसी को भी प्रोत्साहित नहीं करूंगा; विशेष रूप से, DefaultTableModel से उपयोग, या प्राप्त करने से TableModel परिभाषित करने का सबसे अच्छा समाधान नहीं है।

3

मुझे लगता है कि कॉलम मॉडल में जोड़ा गया था, जहां से इसे हटाने की आवश्यकता है?

हां।

क्या कोई विशिष्ट विधि है जिसे मुझे कॉल करने की आवश्यकता है या कॉलम को हटाने के लिए मुझे कुछ तर्क देने की आवश्यकता है?

moveColumn(...); // to move the column to the end 
setColumnCount(...); // to remove the last column 

एक पक्ष नोट के रूप में अगर आप उन छिपाना/दिखाना कॉलम Table Column Manager की जाँच की क्षमता देना चाहता हूँ:

नहीं, लेकिन आप अपनी खुद की विधि बना सकते हैं।

0

DefaultDataModel में वास्तव में कोई कॉलम() फ़ंक्शन नहीं है, इसलिए मैंने स्वयं एक फ़ंक्शन लिखा, जो वास्तव में समस्या को हल कर सकता है।

private void removeColumn(int index, JTable myTable){ 
    int nRow= myTable.getRowCount(); 
    int nCol= myTable.getColumnCount()-1; 
    Object[][] cells= new Object[nRow][nCol]; 
    String[] names= new String[nCol]; 

    for(int j=0; j<nCol; j++){ 
     if(j<index){ 
      names[j]= myTable.getColumnName(j); 
      for(int i=0; i<nRow; i++){ 
       cells[i][j]= myTable.getValueAt(i, j); 
      } 
     }else{ 
      names[j]= myTable.getColumnName(j+1); 
      for(int i=0; i<nRow; i++){ 
       cells[i][j]= myTable.getValueAt(i, j+1); 
      } 
     } 
    } 

    DefaultTableModel newModel= new DefaultTableModel(cells, names); 
    myTable.setModel(newModel);  
}