如何填充JTable中的数据?

时间:2013-06-04 14:46:09

标签: java swing jtable defaulttablemodel

我正在尝试更新我的桌子,但它无法正常工作。在调用它的整个程序完成之前,该表不会显示。我怎么能改变这个?打开窗口后,我想用JTable填充数据。如果我停止执行代码,则表中会填充数据。我需要一个帖子吗?我该如何正确使用?我的代码如下。

public class TestGUI extends DefaultTableCellRenderer implements TeststepEventListener {

    public JFrame frame;
    private JTable testcase_table;
    private JTable teststep_table;

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

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

        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(50, 68, 700, 14);
        frame.getContentPane().add(progressBar);

        JTextPane txtpnAutomotiveHmi = new JTextPane();
        txtpnAutomotiveHmi.setText("Automotive HMI");
        txtpnAutomotiveHmi.setBounds(362, 21, 205, 20);
        frame.getContentPane().add(txtpnAutomotiveHmi);

        testcase_table = new JTable();
        testcase_table.setBounds(50, 125, 350, 426);
        frame.getContentPane().add(testcase_table);

        teststep_table = new JTable();
        teststep_table.setBounds(399, 125, 350, 426);
        frame.getContentPane().add(teststep_table);
    }
    private boolean testcase = true;

    @Override
    public void myEventOccurred(TeststepEvent event) {
        TeststepData data = event.data();
        if (testcase) {
            set_values(data.getDoc(), data.getTestcase());
        }
        testcase = false;

    }
    private int i = 0;
    LinkedList names = new LinkedList();

    private void set_values(Document doc, int testcase) {
        frame.setTitle("Wuratbrot" + i);
        i++;
        Element element = doc.getRootElement();
        names.clear();
        if (element != null) {
            List<Element> testCases = element.getChildren();
            //testcase_table.removeAll();
            //String[] title = {"Testcases"};


            for (Element testCase : testCases) {
                names.add(testCase.getAttributeValue("name"));
            }

            DisplayData(names);
        }

        testcase_table.revalidate();
        frame.validate();
    }

    private void DisplayData(List<String> Testcases) {

        DefaultTableModel aModel = new DefaultTableModel() {
            //setting the jtable read only
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        //setting the column name
        Object[] tableColumnNames = new Object[1];
        tableColumnNames[0] = "TestCases";


        aModel.setColumnIdentifiers(tableColumnNames);
        if (Testcases == null) {

            testcase_table.setModel(aModel);

            return;
        }

        Object[] objects = new Object[1];
        ListIterator<String> lstrg = Testcases.listIterator();
        //populating the tablemodel
        while (lstrg.hasNext()) {
            String newcus = lstrg.next();
            objects[0] = newcus;


            aModel.addRow(objects);
        }

        //binding the jtable to the model
        testcase_table.setModel(aModel);
    }
}

2 个答案:

答案 0 :(得分:1)

SwingWorker就是为此目的。数据采集​​可以在doInBackground()中异步进行,而process()可以通过publish()安全地更新事件发送线程上的TableModel。请特别注意标题为Sample Usage和此tutorial的部分。此外,DefaultTableModel会触发JTable侦听的相应更新事件。不需要额外的代码。另外,使用布局而不是setBounds()

答案 1 :(得分:0)

您需要fireTableDataChanged功能。在更改表格单元格的值后,您应该在表格模型上调用它。