JTable डालें हटाने या डेटा को अपडेट करने के बाद टेबल मॉडल को ताज़ा कैसे करें।


89

यह मेरा जेटबल है

private JTable getJTable() {
    String[] colName = { "Name", "Email", "Contact No. 1", "Contact No. 2",
            "Group", "" };
    if (jTable == null) {
        jTable = new JTable() {
            public boolean isCellEditable(int nRow, int nCol) {
                return false;
            }
        };
    }
    DefaultTableModel contactTableModel = (DefaultTableModel) jTable
            .getModel();
    contactTableModel.setColumnIdentifiers(colName);
    jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    return jTable;
}

मैं डेटाबेस से डेटा को पुनः प्राप्त करने और टेबल मॉडल में डालने के लिए इस विधि को कॉल करूंगा

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
    ArrayList<Contact> list = new ArrayList<Contact>();
    if (!con.equals(""))
        list = sql.getContactListsByGroup(con);
    else
        list = sql.getContactLists();
    for (int i = 0; i < list.size(); i++) {
        String[] data = new String[7];

            data[0] = list.get(i).getName();
            data[1] = list.get(i).getEmail();
            data[2] = list.get(i).getPhone1();
            data[3] = list.get(i).getPhone2();
            data[4] = list.get(i).getGroup();
            data[5] = list.get(i).getId();

        tableModel.addRow(data);
    }
    jTable.setModel(tableModel);
}

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

DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
tableModel.setRowCount(0);

और फिर तालिका मॉडल को फिर से व्यवस्थित करें ताकि यह jTable को ताज़ा करे। लेकिन मैं सोच रहा था कि क्या ऐसा करने के लिए कोई सर्वोत्तम अभ्यास या बेहतर तरीका है?

जवाबों:


119

यदि आप JTableअपने डेटा के परिवर्तनों के बारे में सूचित करना चाहते हैं , तो उपयोग करें
tableModel.fireTableDataChanged()

से प्रलेखन :

सभी श्रोताओं को सूचित करता है कि तालिका की पंक्तियों में सभी सेल मान बदल गए होंगे। पंक्तियों की संख्या भी बदल सकती है और जेटबल को खरोंच से तालिका को फिर से बनाना चाहिए। तालिका की संरचना (स्तंभों के क्रम में) समान मानी जाती है।


क्या मेरा मतलब है कि जब मैं अपडेट कर रहा हूं तो मैं इस तालिका को कॉल करता हूं। MyTelDableDataChanged ()?
user236501

3
@ newbie123: यदि आप केवल नई पंक्तियाँ सम्मिलित करते हैं, तो आप इसके बजाय fireTableRowsInserted का उपयोग कर सकते हैं । दूसरी ओर, कार्यान्वयन DefaultTableModel.addRowपहले से ही संभालना चाहिए कि ... क्या आपकी तालिका ताज़ा नहीं है addRow?
पीटर लैंग

4
उपयोग setValueAt, DefaultTableModelघटना आग।
पीटर लैंग

18
हालांकि, यह देखना चाहिए कि कॉल कास्टेड पर किया जाना चाहिए javax.swing.table.AbstractTableModel, क्योंकि इंटरफ़ेस में TableModelऊपर उल्लिखित विधि नहीं है
मिलान अलेक्सिएक

@PeterLang कृपया मेरा प्रश्न देखें: stackoverflow.com/questions/18282753/…
सजाद

20

आपके मामले का तेज़ तरीका है:

    jTable.repaint(); // Repaint all the component (all Cells).

एक या कुछ सेल बदलने पर अनुकूलित तरीका:

    ((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell.

1
मैंने वास्तव में पाया कि jTable.invalidate () एक ऐसी विधि थी जिसने वास्तव में एक redraw को मजबूर किया।
केविन किउ

सही, लेकिन मान्य विधि लेआउट प्रक्रिया का हिस्सा है, और कंटेनर के माता-पिता को भी प्रभावित करता है। इसलिए यदि आपको लेआउट को फिर से बनाने की आवश्यकता है, तो इसका उपयोग करें। docs.oracle.com/javase/7/docs/api/java/awt/…
डैनियल डी लियोन

8

इसे इस्तेमाल करे

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();

    /**
    * additional code.
    **/
    tableModel.setRowCount(0);
    /**/
    ArrayList<Contact> list = new ArrayList<Contact>();
    if (!con.equals(""))
        list = sql.getContactListsByGroup(con);
    else
        list = sql.getContactLists();
    for (int i = 0; i < list.size(); i++) {
        String[] data = new String[7];

        data[0] = list.get(i).getName();
        data[1] = list.get(i).getEmail();
        data[2] = list.get(i).getPhone1();
        data[3] = list.get(i).getPhone2();
        data[4] = list.get(i).getGroup();
        data[5] = list.get(i).getId();

        tableModel.addRow(data);
    }
    jTable.setModel(tableModel);
    /**
    * additional code.
    **/
    tableModel.fireTableDataChanged();
    /**/
}

2
आपको अंत में jTable.setModel (tableModel) की आवश्यकता नहीं है क्योंकि आपको शुरुआत में ही तालिका का मॉडल मिल गया था।
डेविड जॉर्ज

2
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.fireTableDataChanged(); // notifies the JTable that the model has changed

3
नहीं, नहीं ... DefaultTableModel ने इस घटना को लागू किया है, और सही ढंग से लागू किया है ...
mKorbel

1

क्या इसका उपयोग करना बेहतर नहीं होगा java.util.Observableऔर java.util.Observerइसके कारण तालिका अपडेट होगी?


6
नहीं, निश्चित रूप से नहीं, ऐसा मत करो, क्यों नकली JTable के अंतर्निहित विकल्प और EDT से बाहर
mKorbel

-4

मैंने इसे अपने Jtable में 300 ms के बाद इसका autorefreshing पसंद किया;

DefaultTableModel tableModel = new DefaultTableModel(){
public boolean isCellEditable(int nRow, int nCol) {
                return false;
            }
};
JTable table = new JTable();

Timer t = new Timer(300, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addColumns();
                remakeData(set);
                table.setModel(model);
            }
        });
        t.start();

private void addColumns() {
        model.setColumnCount(0);
        model.addColumn("NAME");
            model.addColumn("EMAIL");} 

 private void remakeData(CollectionType< Objects > name) {
    model.setRowCount(0);
    for (CollectionType Objects : name){
    String n = Object.getName();
    String e = Object.getEmail();
    model.insertRow(model.getRowCount(),new Object[] { n,e });
    }}

मुझे संदेह है कि यह 500 से अधिक वस्तुओं की बड़ी संख्या के साथ अच्छा करेगा, केवल अन्य तरीका आपकी कक्षा में TableModelListener को लागू करना है, लेकिन मुझे समझ में नहीं आया कि इसका उपयोग कैसे करें। देखो http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.