单击按钮更新JTable

我正在使用带有自定义表模型的JTable 。 我已使用该post中提供的建议更新了我的代码并遇到了新问题。 我对我的代码所做的更改是将一个ArrayList注入到我的JTable以避免线程出现问题。 执行此操作后,按下按钮更新我的表的代码已停止工作。

用于初始化JTable的代码如下:

 TableModel model = new PlayerTableModel(FileHandler.getCompletedPlayers()); JTable table = new JTable(model); 

我用来更新JTable的代码如下:

 JButton btnRefreshAllPlayers = new JButton("Refresh"); btnRefreshAllPlayers.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { PlayerTableModel model = (PlayerTableModel) table.getModel(); model.fireTableDataChanged(); } }); 

我也试过使用repaint()但这也不起作用。 到目前为止,让JTable更新的唯一方法是关闭并重新打开程序。 FileHandler有我用于JTableArrayList ,当用户添加更多玩家时,它会增加。

为什么fireTableDataChanged()没有检测到任何变化?

我已经搜索了stackoverflow,并且有几个人说过要使用这种方法。

不,你不应该在TableModel本身的上下文之外调用任何fireTableXxx方法,人们建议否则是完全错误的,它将在未来引起你的问题。 从代码的外观来看,没有任何改变。 如果您已根据上一个问题中提供的答案更新了TableModel ,则模型中的数据与外部源无关。 您需要手动从外部源重新加载数据,创建一个新的TableModel并将其应用于表

例如…

 JButton btnRefreshAllPlayers = new JButton("Refresh"); btnRefreshAllPlayers.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { TableModel model = new PlayerTableModel(FileHandler.getCompletedPlayers()); table.setModel(model); } }); 

我也尝试使用更新的ArrayList设置一个新模型并且它工作但是没有保留我之前设置的表行宽度。

对于表来说这是一个合理的事情,因为它不知道新模型是否具有与旧模型相同的属性/列,因此它会重置它们。

在应用模型并重新应用宽度之前,您可以遍历ColumnModel ,将列宽存储在ListMap

有没有正确的方法来更新JTable?

您可以为TableModel提供一个刷新方法,该方法可以加载数据本身并触发tableDataChanged事件

 public class PlayerTableModel extends AbstractTableModel { private final List summaries; public PlayerTableModel(List summaries) { this.summaries = new ArrayList(summaries); } // Other TabelModel methods... public void refresh() { summaries = new ArrayList<>(FileHandler.getCompletedPlayers()); fireTableDataChanged(); } } 

然后你需要在ActionListener调用这个方法……

 PlayerTableModel model = (PlayerTableModel)table.getMode(); model.refresh();