Jtable doesn't refresh/update data

前端 未结 2 1732
被撕碎了的回忆
被撕碎了的回忆 2020-12-20 03:07

I have a problem with JTable/JScrollPane. My data table is not refreshing/updating. I am using DefultTableModel and according to the c

相关标签:
2条回答
  • 2020-12-20 03:41

    Your first snippet shows this:

    JTable table = new JTable(model);

    but your gui() constructor shows:

    JTable table = new JTable(data, columnNames);

    You initiate the table twice. Once using the TableModel (JTable(TableModel tm)) the next using JTable(int rows,int cols) this is not good, initiate the JTable once in the constructor:

    gui() {
    DefaultTableModel model = new DefaultTableModel(data,columnNames);
    JTable table =  new JTable(model);
    JScrollPane scrollPane = new JScrollPane(table);
    
    JButton next = new JButton("next");
    JButton prev = new JButton("prev");
    next.addActionListener(this);
    prev.addActionListener(this);
    JPanel panel = new JPanel(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(prev);
    buttonPanel.add(next);
    panel.add(buttonPanel, BorderLayout.SOUTH);
    panel.add(table.getTableHeader(), BorderLayout.PAGE_START);
    panel.add(scrollPane, BorderLayout.CENTER);
    getContentPane().add(panel);
    }
    

    UPDATE:

    Here is an example that has a thread which will start 2.5 secinds after the UI is visible and change a value of the JTable:

    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    
    public class Test extends JFrame {
    
        public static void main(String[] args) throws Exception {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Test().createAndShowUI();
                }
            });
    
        }
    
        private void createAndShowUI() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            initComponents(frame);
            frame.pack();
            frame.setVisible(true);
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        Thread.sleep(2500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                    } 
                    SwingUtilities.invokeLater(new Runnable() {
    
                         @Override
                         public void run() {
                           model.setValueAt("hello", 0, 0);
                         }
                    });
                }
            }).start();
        }
        static DefaultTableModel model;
    
        private void initComponents(JFrame frame) {
    
            String data[][] = {
                {"1", "2", "3"},
                {"4", "5", "6"},
                {"7", "8", "9"},
                {"10", "11", "12"}
            };
    
            String col[] = {"Col 1", "Col 2", "Col 3"};
    
            model = new DefaultTableModel(data, col);
            JTable table = new JTable(model);
    
            frame.getContentPane().add(new JScrollPane(table));
        }
    }
    
    0 讨论(0)
  • 2020-12-20 03:44

    From what I understand from the comments and the question, you have first created a DefaultTableModel by passing the data as arrays in the constructor

    String[][] data = new String[100][4];
    String[] columnNames = new String[]{
         "IP", "PC_NAME", "ttl", "db"};
    DefaultTableModel model = new DefaultTableModel(data,columnNames);
    

    and you try to modify the table afterwards by adjusting those arrays. That will never ever have any effect, as the DefaultTableModel does not use those arrays. This can be seen in the source code of that class

    public DefaultTableModel(Object[][] data, Object[] columnNames) {
        setDataVector(data, columnNames);
    }
    

    which in the end comes down to

    protected static Vector convertToVector(Object[][] anArray) {
        if (anArray == null) {
            return null;
        }
        Vector<Vector> v = new Vector<Vector>(anArray.length);
        for (Object[] o : anArray) {
            v.addElement(convertToVector(o));
        }
        return v;
    }
    

    So all the elements of the array are copied into an internal Vector and the array is no longer used.

    Solution: do not update the arrays but update the DefaultTableModel. That class provides all the API you need to add/remove data to/from it.

    0 讨论(0)
提交回复
热议问题