<AI>
setCellFactory の内部(updateItem メソッド内)で前後の値を比較するには、
古い値をフィールドに保持しておくか、直接 getItem() で取得して比較します。
1. updateItem の中で比較する
基本パターンsuper.updateItem(item, empty) を呼び出す前に getItem() で取得した値を「古い値」とし、新しく渡された item と比較します
java
setCellFactory(column -> new TableCell() {
@Override
protected void updateItem(String newItem, boolean empty) {
// 現在の古い値を取得
String oldItem = getItem();
// 必須: スーパークラスのメソッドを呼び出す
super.updateItem(newItem, empty);
if (empty || newItem == null) {
setText(null);
setGraphic(null);
} else {
// new と old の値の比較
if (newItem.equals(oldItem)) {
// 値が変わっていない場合の処理
} else {
// 値が新しくなった(または変更された)場合の処理
setText(newItem);
}
}
}
});
2. セルのリサイクル(再利用)に注意
JavaFXのテーブルやリストのセルはスクロール時に再利用(リサイクル)されます。
このため、「表示されている行のデータ」が変更されたのか、「別の行へセルが使い回された」のかを判定するには、
getIndex() または行の参照データも一緒に比較する必要があります。
行のデータ自体(オブジェクト)を判定する場合は以下のようになります。
java
// セルリサイクル対応の比較例
if (newModel != null && oldModel != null && newModel.getId() == oldModel.getId()) {
// データが同じ行のままで、値のみ変更された場合
} else {
// 別の行にセルがリサイクルされた、または新規データ
}
3. より安全なプロパティ値の監視
プロパティの変更を検知する場合、itemProperty().addListener を活用するアプローチもあります