0

我有一个 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 确定

4

2 回答 2

4

您需要将视图行索引转换为模型的行索引

看看JTable#convertRowIndexToModel

于 2012-11-04T19:49:49.107 回答
2

您不应该覆盖该JTable#getToolTipText方法。只需在渲染器返回的组件上设置工具提示文本。会JTable自动捡起来。getTooltipText你可以在方法的实现中看到这一点JTable

于 2012-11-04T22:21:23.077 回答