我正在使用JTable
找到here的自定义表格模型。我已使用该帖子中提供的建议更新了我的代码并遇到了新问题。我对我的代码所做的更改是将ArrayList<CompletedPlayer>
注入我的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
ArrayList
我使用的JTable
fireTableDataChanged()
随着用户添加更多玩家而增加了searchTimeoutID = window.setTimeout(LiveSearch, 100);
。
为什么没有LiveSearch();
检测到任何变化?
答案 0 :(得分:0)
我搜索了stackoverflow,有几个人说过用这种方法。
不,你不应该在fireTableXxx
本身的上下文之外调用任何TableModel
方法,人们认为这些方法完全是错误的,并且将来会引起你的问题。从代码的外观来看,没有任何改变。如果您根据上一个问题中提供的答案更新了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
,在应用模型之前将列宽保存在List
或Map
中并重新应用宽度
是否有更新JTable的正确方法?
您可以为TableModel
提供刷新方法,该方法可以自行加载数据并触发tableDataChanged
事件
public class PlayerTableModel extends AbstractTableModel {
private final List<PlayerSummary.Player> summaries;
public PlayerTableModel(List<PlayerSummary.Player> summaries) {
this.summaries = new ArrayList<PlayerSummary.Player>(summaries);
}
// Other TabelModel methods...
public void refresh() {
summaries = new ArrayList<>(FileHandler.getCompletedPlayers());
fireTableDataChanged();
}
}
然后您需要在ActionListener
...
PlayerTableModel model = (PlayerTableModel)table.getMode();
model.refresh();