私は JTable を持っており、マウスが行にカーソルを合わせると、その中の単一の行が別のツールチップに関連付けられています。このテーブルの「フィルター」を作成しました。適用すると、非表示にする必要がある行が完全に非表示になりますが、フィルター処理された行にマウスを合わせると、ツールチップが新しい現在の行と同じ行位置を占めていた行を参照しているように見えます。
例えば:
テーブル
行 1 -> ツールチップ 1
行 2 -> ツールチップ 2
テーブルにフィルタを適用:
行 2 -> ツールチップ 1
したがって、ROW 2 には 2 ではなくツールチップ 1 が表示されます。
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 -> ソートが有効で、メソッド getRowCount で決定された JTable の範囲外のインデックスが渡された場合