在setModel之后更新JTable

时间:2017-08-06 23:47:56

标签: java swing intellij-idea jtable defaulttablemodel

我有一个JTable,我无法让它更新其内容,我在IntelliJ IDEA。

我先分享一些代码

我拥有在主类中声明的所有对象,它扩展了JFrame

private Object[][] transactionsData;
private String[] transactionsColumnNames = new String[] {"uid","data","ora","product","ini","amount","final"};
private DefaultTableModel transactionsModel;
private JTable transactionsTable;

然后在createUIComponents()方法中,我设法理解,在最开始调用,当需要创建UI时,我像这样初始化表:

    transactionsData = Main.db.getTransactions();
    transactionsModel = new DefaultTableModel(transactionsData,transactionsColumnNames);
    transactionsTable = new JTable(transactionsData,transactionsColumnNames){
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component component = super.prepareRenderer(renderer, row, column);
            int rendererWidth = component.getPreferredSize().width;
            TableColumn tableColumn = getColumnModel().getColumn(column);
            tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
            return component;
        }

    };

    transactionsTable.setRowSelectionAllowed(true);
    transactionsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    transactionsTable.setDefaultEditor(Object.class, transactionsEditor);
    transactionsTable.getTableHeader().setFont(new Font("Segoe",Font.PLAIN,16));

    sorter = new TableRowSorter<>(transactionsTable.getModel());
    transactionsTable.setRowSorter(sorter);
    transactionsTable.getSelectionModel().addListSelectionListener(e -> {
        if ( transactionsTable.getSelectedRows().length > 0 ) {
            logUIDField.setText(transactionsTable.getValueAt(transactionsTable.getSelectedRow(), 0).toString());
            transactionsTable.clearSelection();
            uidFilter();
        }
    });

现在,每次单击按钮我都会切换框架的内容并显示表格,我需要它才能在显示之前更新其内容,因为它的内容来自在线数据库,当然,它的内容内容可能已经改变,所以我这样做:

    storicoButton.addActionListener(e -> {

        if( Main.db.hasTag() )
            logUIDField.setText(Main.db.tag.getUid());
        else
            logUIDField.setText("");

        transactionsData = Main.db.getTransactions();
        transactionsModel = new DefaultTableModel(transactionsData, transactionsColumnNames);
        transactionsTable.setModel(transactionsModel);

        uidFilter();

        CardLayout cardLayout = (CardLayout) rootPanel.getLayout();
        cardLayout.show(rootPanel, "Card4");
    });

但是我无法让它更新其内容,我尝试了我可以在互联网上找到的所有内容,并且在这个网站上,但每个人都说只使用setModel,但它不起作用,我可以'找到我做错了什么。

我尝试在单击按钮之前和之后读取transactionsData,transactionsModel和transactionsTable的大小,transactionsData和transactionsModel实际更新,因为它们的大小相应地更改(我在运行程序时查看了数据库)但是TransactionsTable没有根本不会改变。

我尝试了repaint(),看起来像“updateSomething”的各种方法,我尝试使用局部变量,全局变量,初始化新模型,更新模型,使用模型或数据和列初始化表,什么都没有。我很绝望。

我希望有人可以帮助我。

目前这里已经晚了,明天我需要早起,下班后我会尝试开始干净,从头开始重写一切,也许我会自己找到解决方案,同时希望有人在这里至少可以把我推向正确的方向。

我发布了我在网上发现的那个uidFilter()的代码,这是我明天要删除的第一件事,因为我怀疑它可以改变一些东西,但我现在没有时间去做/ p>

private void uidFilter() {
    RowFilter<TableModel, Object> rf = null;
    //If current expression doesn't parse, don't update.
    try {
        rf = RowFilter.regexFilter(logUIDField.getText(), 0);
    } catch (java.util.regex.PatternSyntaxException e) {
        return;
    }
    sorter.setRowFilter(rf);
}

0 个答案:

没有答案