我有一个 JTable,当鼠标悬停一行时,其中的任何单行都关联了不同的工具提示。我为此表创建了一个“过滤器”;当它被应用时,它完美地隐藏了需要隐藏的行但是当我将鼠标悬停在过滤的行上时,看起来工具提示指的是占据新当前行的相同行位置的行。
例如:
桌子
第 1 行 -> 工具提示 1
第 2 行 -> 工具提示 2
对表应用过滤器:
第 2 行 -> 工具提示 1
所以第 2 行显示的是工具提示 1 而不是 2。
TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>) table.getRowSorter();
sorter.setRowFilter(RowFilter.regexFilter(text));
我的扩展 JTable 的表有:
@Override
public String getToolTipText(MouseEvent e) {
final int rowIndex = rowAtPoint(e.getPoint());
TableModel model = getModel();
// take the value from the first column of the selected row
String tip = (String) getModel().getValueAt(rowIndex, 0));
return tip;
}
所以看起来使用模型并没有(很明显)更新过滤器。我也尝试使用 TableModel model = getRowSorter().getModel() 但没有任何运气。
如何指向正确的“过滤模型”以检索正确的行位置?
更新:
我已经像这样替换了“rowIndex”代码:
final int rowIndex = convertRowIndexToModel(rowAtPoint(e.getPoint()));
它部分解决了这个问题,但是当一些行被动态添加到应用了过滤器的表中并且我悬停新行时,我得到了异常(带有相关 API 描述):
IndexOutOfBoundsException -> 如果启用了排序并传递了 JTable 范围之外的索引,由方法 getRowCount 确定