【问题标题】:Multipage JTable: impossible to display less items than rows多页 JTable:不可能显示比行少的项目
【发布时间】:2011-12-05 17:30:32
【问题描述】:

我实现了一个带有自定义AbstractTableModel 的JTable,用于实现分页。 我想每页显示 5 个项目,但我有一个问题:如果我有 N 个项目要显示(N 是 5 的倍数)一切都可以,但是如果我有 14 个元素要显示,我得到一个例外。问题是获取每个单元格值的方法超出了界限。特别是问题出在方法上

public Object getValueAt(int row, int col) {
    int realRow = row + (pageOffset * pageSize);
    return data[realRow].getValueAt(col);
}

实际上,我们有 5 行(从 0 到 4)和 14 个元素,但很明显,当我们尝试获取最后一个元素时,我们这样做了:realRow = 4 + (2*5),显然我在第 14 行没有元素。 我怎么解决这个问题?一旦到达第 14 个文件,我如何告诉我的程序停止获取价值?有可能吗?

【问题讨论】:

  • 或许您可以澄清一下:在您的代码中,pageOffset 和 pageSize 是什么?这些不是任何类型的标准 tableModel 字段,因此了解它们的用途将有助于我们了解您的问题。
  • pageOffset 是页码(pageOffset = 0 表示从 0 到 4 的项目,1 表示从 5 到 9 的项目,2 表示从 10 到 14 的项目) pageSize 是每页的元素数(在此大小写等于 5)

标签: java swing jtable paging


【解决方案1】:

确保您的模型的 getRowCount 方法与您希望它执行的操作一致。 getRowCount 方法应该为您的表返回一个可接受的数字,以便它不会为任何不存在的行调用 getValueAt。因此,如果您没有第 14 行,那么您的行数应该不会那么高。

【讨论】:

  • 我的 getRowCount 是 return Math.min(pageSize, data.length);
  • 那么,data字段是跨多个页面的整个表的数据,还是每个页面的data不同?
  • 数据字段是跨多个页面的整个表格的数据
  • 所以,如果有两个完整的页面(每个 5 行),最后一页有 3 行,那么数据总量是 13 个条目。对于最后一页,您的模型是获得 2 行还是 3 行?如果你得到一个 2,那么你的数学(页面 * 偏移量)是正确的,并且会将 2 转换为 12,但是如果你得到一个 3(我假设你是手动调用 getValueAt),那么你有一个问题...
【解决方案2】:

我认为不是easy job,我建议看aephyr's code,也许更简单的方法是实现这个code,但要获得真正的效果,你必须锁定JScrollBars,切换到NEVER

【讨论】:

  • 我已经看到了你发布的两个链接,事实上我使用了其中的第二个。但它只适用于每个页面中显示的元素数量完全可整除的元素(保持为 0)
【解决方案3】:

只需将值固定到可接受的最大值:

realRow = Math.min(realRow, getRowCount());

附录:在example cited中,实现getValueAt()如下:

// Work only on the visible part of the table.
public Object getValueAt(int row, int col) {
    int realRow = row + (pageOffset * pageSize);
    if (realRow < data.length) {
        return data[realRow].getValueAt(col);
    } else {
        return null;
    }
}

也可以考虑BasicArrowButton

【讨论】:

  • 但是她会得到一个不存在的行的值,这并不是对异常的真正改进。它只是掩盖了问题,这是一个开发不当的模型。
  • 根据引用的示例更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2023-04-10
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多