我有一个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);
}