JTable কীভাবে সারণী মডেলটি রিফ্রেশ করবেন toোকাতে বা ডেটা আপডেট করার পরে।


90

এটি আমার জেটিবেল

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);

এবং তারপরে আবার টেবিলের মডেলটিকে পুনর্গঠন করুন যাতে এটি জেটিবেলকে রিফ্রেশ করবে। তবে আমি ভাবছিলাম যে এটি করার কোনও সেরা অনুশীলন বা আরও ভাল উপায় আছে?

উত্তর:


119

আপনি যদি JTableনিজের ডেটা পরিবর্তন সম্পর্কে আপনার অবহিত করতে চান তবে ব্যবহার করুন
tableModel.fireTableDataChanged()

ডকুমেন্টেশন থেকে :

সমস্ত শ্রোতাকে জানিয়ে দেয় যে টেবিলের সারিগুলির সমস্ত কক্ষের মানগুলি পরিবর্তিত হতে পারে। সারিগুলির সংখ্যাও পরিবর্তিত হতে পারে এবং জেটিবেলটিকে স্ক্র্যাচ থেকে টেবিলটি পুনরায় আঁকতে হবে। সারণির কাঠামো (কলামগুলির ক্রম অনুসারে) একই বলে ধরে নেওয়া হয়।


আপনি কী এই মুহূর্তে আমি আপডেট করার সময় এই টেবিলটিকে মডেল.ফায়ার টেবিলডাটাচ্যাঞ্জড () কল করি?
ব্যবহারকারী 236501

4
@ newbie123: আপনি যদি কেবল নতুন লাইনগুলি সন্নিবেশ করান তবে আপনি এর পরিবর্তে ফায়ারটেবলরোস প্রবেশ করতে পারেন । অন্যদিকে, এর বাস্তবায়ন DefaultTableModel.addRowইতিমধ্যে হ্যান্ডেল করা উচিত ... আপনার টেবিলটি কি সতেজ নয় addRow?
পিটার ল্যাং

4
ব্যবহার করুন setValueAt, DefaultTableModelঘটনা আগুন।
পিটার ল্যাং

19
যদিও লক্ষ্য করা উচিত যে কলটি অবশ্যই কাস্ট করা উচিত 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.

4
আমি আসলে খুঁজে পেয়েছি যে jTable.inediaate () হ'ল এমন একটি পদ্ধতি যা আসলে একটি পুনরায় চিত্র আঁকতে বাধ্য করেছিল।
কেভিন কিউ

ঠিক আছে, তবে বৈধতা পদ্ধতিটি বিন্যাস প্রক্রিয়ার অংশ এবং এটি ধারকটির পিতামাতাকেও প্রভাবিত করে। সুতরাং আপনার যদি পুনরায় লেআউটটি প্রয়োজন হয় তবে এটি ব্যবহার করুন। 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();
    /**/
}

4
আপনি ইতিমধ্যে শুরুতে টেবিলের মডেলটি পেয়েছেন বলে শেষে আপনাকে jTable.setModel (টেবিলমোডেল) লাগবে না।
ডেভিড জর্জ

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

4
না, নয় ... ডিফল্ট টেবিলমোডেল এই ইভেন্টটি কার্যকর করেছে এবং সঠিকভাবে প্রয়োগ করেছে ...
এমকোর্বল

1

এটি ব্যবহার করা ভাল না java.util.Observableএবং java.util.Observerটেবিল আপডেট হতে হবে?


7
না, নিশ্চিত না, যে না, কেন কৃত্রিম JTable এর বিল্ট-ইন বিকল্প এবং আউট ইডিটি থেকে
mKorbel

-4

আমি এটি আমার জেটেবেলে 300 এমএসের পরে এর অটোফ্রেশিংয়ের মতো এটি করেছি;

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 এরও বেশি সংখ্যক অবজেক্টের সাথে ভাল করবে, কেবলমাত্র অন্য উপায়টি আপনার ক্লাসে টেবিলমোডেললিস্টনার প্রয়োগ করা, তবে কীভাবে এটি ভালভাবে ব্যবহার করবেন তা আমি বুঝতে পারি নি। তাকান http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.