JavaFX 2モーダルダイアログウィンドウでListViewコントロールを使用しています。JavaFX 2.2:ListViewの再描画/更新を強制する方法
このListViewは、セル工場で製造されたListCellsであるDXAliasインスタンスを表示します。ファクトリオブジェクトが行う主なことは、ListViewのUserDataプロパティデータを調べ、それをListCellに対応する項目と比較することです。それらが同じ場合、ListCellのコンテンツは赤で表示され、そうでない場合は黒で表示されます。これは、ListView内のどのアイテムが現在「デフォルト」として選択されているかを示すために行います。
private class AliasListCellFactory implements
Callback<ListView<DXSynonym>, ListCell<DXSynonym>> {
@Override
public ListCell<DXSynonym> call(ListView<DXSynonym> p) {
return new ListCell<DXSynonym>() {
@Override
protected void updateItem(DXSynonym item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
DXSynonym dx = (DXSynonym) lsvAlias.getUserData();
if (dx != null && dx == item) {
this.setStyle("-fx-text-fill: crimson;");
} else { this.setStyle("-fx-text-fill: black;"); }
this.setText(item.getDxName());
} else { this.setText(Census.FORMAT_TEXT_NULL); }
}};
}
私が選択したDXAliasインスタンスを取り、によって、リストビューに新しいデフォルトを選択した項目を作る「handleAliasDefault()」と呼ばれるボタンのハンドラを持っている:あなたは私が何を意味するか見ることができるようにここに私のlistcellファクトリクラスですそれをListView:lsvAlias.setUserData(選択されたDXAlias)に格納します。ここではハンドラのコードは次のとおりです。
// Handler for Button[fx:id="btnAliasDefault"] onAction
@FXML
void handleAliasDefault(ActionEvent event) {
int sel = lsvAlias.getSelectionModel().getSelectedIndex();
if (sel >= 0 && sel < lsvAlias.getItems().size()) {
lsvAlias.setUserData(lsvAlias.getItems().get(sel));
}
}
既定値に設定]ボタンをクリックに応答して行われる変更は、リストが正しく示すものではありません、バッキングObservableListを変更せずにリストビューのUserDataを()を変更することであるため、新しいデフォルト。
強制的にListViewにListCellを再描画する方法はありますか?この件に関して、Androidユーザーからは数千万の質問がありますが、JavaFXには幸福感はないようです。再描画を強制するために、バッキングアレイに「意味のない変更」を行わなければならない場合があります。 Javafx ListView refreshing
私は、コードを示さなかったが、 ListViewのデータはObservableList内にあります。各データモデル項目はJavaFXプロパティです。 ListViewのコントラクトでは、データが変更されるとビューが自動的に更新されます。データそのものが表示されていないときに、データの表示方法が変わったときに何が起こるべきかについて何も言わないようです。新しいバインディングを追加すると解決策が得られるかもしれませんが、非常に醜いコード、多分脆弱なコードを犠牲にしています。私が必要とするのは、選択したデフォルトが変更されたときにListCellを再描画することだけです。 – scottb
これは、javafx 2の仕組みの共通の特性です。シーングラフのノード(特定のセル)がそのプロパティを変更して視覚的表現に影響を及ぼす場合、シーングラフは必要に応じてそれらのノード(セル)を再描画します。したがって、セルの視覚的外観を更新すると、シーングラフによって再描画されます。 –
私はあなたが言っていることを見ていますが、実際に私のデータモデルの一部ではないプロパティを含めるために、私のデータモデルをリファクタリングする必要があるとも思いません。私は、選択したデフォルトエイリアスを黒ではなく赤でレンダリングしたいだけです。 1つの簡単な方法があれば問題は解決します:lsvAlias.requestRefresh(); – scottb