各行に条件付きスタイルが必要な JavaFX TableView があります。
スタイリングは、テーブル行のソース アイテムが特定のリストに存在するかどうかによって異なります。
これは私がこれまでに持っているものです:
1) テーブル行のデータを 2 つのブール型プロパティ (データがリスト X に含まれている場合は true) と、正しいスタイル属性にバインドする必要がある文字列プロパティと共に保持するデータ クラス。
private class WebPageData {
private WebPage page;
private BooleanProperty isReferenced = new SimpleBooleanProperty(false);
private BooleanProperty isReferencing = new SimpleBooleanProperty(false);
private StringBinding style = new When(isReferenced).then("...").otherwise(...);
}
2) テーブル選択が変更されたときに、それに応じて各ブール値プロパティを更新するテーブル選択変更の変更リスナー
tblResultData.getSelectionModel().getSelectedIndices().addListener(new ListChangeListener<Integer>() {
@Override
public void onChanged(ListChangeListener.Change<? extends Integer> arg0) {
if (arg0.getList().size() == 0) {
selectedPage.set(null);
} else {
// for coloring only consider the first selected row
// multi select must be doable for certain other features
WebPage selectedWebPage = tblResultData.getItems().get(arg0.getList().get(0)).page;
selectedPage.set(selectedWebPage);
// tableModel.data holds a list of data for every table row
for (WebPageData data : tableModel.data) {
boolean referenced = selectedWebPage.getReferencedWebPagesList().contains(data.page);
boolean referencing = selectedWebPage.getReferencingWebPagesList().contains(data.page);
data.isReferenced.set(referenced);
data.isReferencing.set(referencing);
}
}
}
});
ここで私がやりたいことは、各テーブル セルのスタイル プロパティを WebPageData のスタイル プロパティに何らかの方法でバインドすることです。変更リスナーが 2 つのブール値プロパティを更新するため、WebPageData のスタイル プロパティが更新され、その結果、表のセルが変わります。
カスタム TableCellFactory を使用して作成段階でスタイルをバインドしようとしましたが、現時点では WebPageData インスタンスが存在しないため、もちろんこのアプローチは失敗します。TableColumn クラスはすべてのセルを反復する機会を提供しないため (そのため、テーブルが実際にデータを取得した後にスタイルをバインドできます)、現在表示されている唯一のオプションは、作成された各テーブル セルへの参照を保持することです。この解決策は良い習慣だとは思いません。
セル スタイルをバインドする他のオプションはありますか? それらをバインドしない場合、テーブルの選択が変更されるたびにスタイルを手動で設定する必要があります。これにより、「セルを反復処理できない」という問題が再び発生します。