按下按钮更新JTable

时间:2015-07-20 22:45:23

标签: java swing jtable

我正在使用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(); 检测到任何变化?

1 个答案:

答案 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,在应用模型之前将列宽保存在ListMap中并重新应用宽度

  

是否有更新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();