刷新JTable中的所有数据

时间:2013-10-22 15:32:07

标签: java swing jtable

我在使用以下方面看到了很多关于刷新JTable的线程:

String[] columnNames = {"column1","column2,......,"columnN"};
String[][] tableData = new String[1][columnNames.length];
JTable table = new JTable(tableData,columnNames);

JScrollPane scrollpane = new JScrollPane(table);
contentPane.add(scrollpane);

...对tableData中存储的数据进行更改,然后调用...

AbstractTableModel model = (AbstractTableModel) table.getModel();
model.fireTableDataChanged();

但这对我来说似乎没有任何改变。我需要首先显示一行显示一行空白表,然后在用户加载数据文件时更新它,但下面的代码似乎对我不起作用。我假设它是因为我重新定义tableData但必须这样做,因为我不知道在用户加载文件之前要显示多少行数据。我该如何更新表格?


修改 为了使我运行的代码更清晰:

//Initialize Table With 1 Blank Row
String[] columnNames = {"column1","column2,......,"columnN"};
String[][] tableData = new String[1][columnNames.length];
JTable table = new JTable(tableData,columnNames);

JScrollPane scrollpane = new JScrollPane(table);
contentPane.add(scrollpane);

//When the file is loaded resize tableData so it can fit all the file data
tableData = new String[length of data file][columnNames.length];

//Update some of the tableData points
tableData[0][0]="data 1";
tableData[1][0]="data 2";
tableData[0][1]="data 3";
tableData[1][1]="data 4";
....etc

//Tell the JTable to update
AbstractTableModel model = (AbstractTableModel) table.getModel();
model.fireTableDataChanged();

2 个答案:

答案 0 :(得分:3)

我认为问题是当您创建JTable时,您没有为其分配任何模型。

见下面的例子:

这里太多了,但你会明白这一点。

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TestGUI {

    private JFrame frame;
    private JTable table;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestGUI window = new TestGUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public TestGUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(60, 81, 311, 96);

        frame.getContentPane().add(scrollPane);

        String[] columnNames = { "column1", "column2", "columnN" };
        String[][] tableData = new String[1][columnNames.length];
        table = new JTable(tableData, columnNames);
        DefaultTableModel model = new DefaultTableModel(2, columnNames.length);
        model.addRow(new String[] { "A", "B", "C" });
        table.setModel(model);

        scrollPane.setViewportView(table);

        JButton btnNewButton = new JButton("update");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                DefaultTableModel model = (DefaultTableModel) table.getModel();
                model.addRow(new String[] { "A", "B", "D" });

            }
        });
        btnNewButton.setBounds(49, 199, 89, 23);
        frame.getContentPane().add(btnNewButton);
    }
}

答案 1 :(得分:2)

您的示例永远不会正常工作,因为DefaultTableModel(默认使用此处)会将所有数组数据复制到内部vector-object中。因此,原始数组中的更改将永远不会传播到DefaultTableModel的内部结构。

直接使用DefaultTableModel来避免您的问题。