实现JTable更新

时间:2015-04-20 18:37:50

标签: java swing jtable

我有以下代码用于创建JTable

public void tableTeam()
{
    rl.readRunners();
    String[] sampleHeaders = {"Athlete ID", "Team"};

    JTable myTable = new JTable(rl.teamTableData,sampleHeaders);

    myTable.setAutoCreateRowSorter(true);
    myTable.setRowHeight(20);
    ///////////////
    sorter = new TableRowSorter(myTable.getModel());
    List sortKeys = new ArrayList();
    sortKeys.add(new RowSorter.SortKey(1, SortOrder.DESCENDING));
    sorter.setSortKeys(sortKeys);
    sorter.setRowFilter
    (
        new RowFilter<TableModel, Integer>()
            {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
                {
                    boolean included = true;
                    Object cellValue = entry.getModel().getValueAt(entry.getIdentifier(), 0);
                    if (cellValue == null || cellValue.toString().trim().isEmpty())
                    {
                        included = false;
                    }
                    return included;
                }
            }
    );
    myTable.setRowSorter(sorter);
    ///////////////

    teamScrollTable = new JScrollPane(myTable);
    teamScrollTable.setSize(500,300);
    teamScrollTable.setLocation(50,100); 
    System.out.println("Creating team table");



    teamPanel.add(teamScrollTable);
}

然后我有了这个代码来更新表格。

public void RefreshTeam()
{
    teamPanel.remove(teamScrollTable);

    rl.readRunners();
    String[] sampleHeaders = {"Athlete ID", "Team"};

    JTable myTable = new JTable(rl.teamTableData,sampleHeaders);

    myTable.setAutoCreateRowSorter(true);
    myTable.setRowHeight(20);
    ///////////////
    sorter = new TableRowSorter(myTable.getModel());
    List sortKeys = new ArrayList();
    sortKeys.add(new RowSorter.SortKey(1, SortOrder.DESCENDING));
    sorter.setSortKeys(sortKeys);
    sorter.setRowFilter
    (
        new RowFilter<TableModel, Integer>()
            {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
                {
                    boolean included = true;
                    Object cellValue = entry.getModel().getValueAt(entry.getIdentifier(), 0);
                    if (cellValue == null || cellValue.toString().trim().isEmpty())
                    {
                        included = false;
                    }
                    return included;
                }
            }
    );
    myTable.setRowSorter(sorter);

    teamScrollTable = new JScrollPane(myTable);
    teamScrollTable.setSize(500,300);
    teamScrollTable.setLocation(50,100); 
    System.out.println("Changing team table");

    teamPanel.add(teamScrollTable);
}

单击程序上的按钮时,将激活此代码。然而,与我的期望不同,这不会更新表格。我做了一些研究,发现了这行代码fireTableCellUpdated()。虽然我无法将其实现到我的代码中,因此我更新了表,因为我不知道如何。我非常感谢有人帮我实现这段代码或者向我展示了一个更好的方法来做我想做的事。

2 个答案:

答案 0 :(得分:2)

要更新表格,您可以使用以下内容:

myTable.setModel(new DefaultTableModel(rl.teamTableData,sampleHeaders));

答案 1 :(得分:0)

refreshTeam方法(注意java方法应该以小写开头)不是更新JTable,而是完全创建一个新表,然后尝试将这些组件添加到(我认为是)已经可见的UI中。用户界面没有意识到这一点,因此在添加/删除组件后,您应该调用...

revalidate();
repaint();

......关于组件。这种方法有其他选择 - 您可以更改模型而不是重新创建表。您可以通过实现自己的AbstractTableModel来实现此目的(然后可以调用在实例上引用的fireTableDataChanged来更新数据已更改的侦听器。)