ObservableList
が変更されたときにListView
(チェックボックスリストビュー)が更新されないという問題があります。JRE6 JavaFX2.2でObservableListが変更されたときにJavaFX ListViewが更新されない
この問題は、日付の付いたJavaFXおよび日付付きJRE(jre6およびjfx2.2)を使用している場合にのみ発生します。 jre8とそれに含まれるJavaFXを使用すると、問題はなくなり、リストはきれいに更新されます。 JavaFXのは、前述した最新に
作業するソースコード:
リスト:
public ObservableList<TestCaseCheckboxModel> TestCases;
//Constructor
public SessionTestCaseModel() {
TestCases = FXCollections.observableArrayList(new Callback<TestCaseCheckboxModel, Observable[]>(){
@Override
public Observable[] call(TestCaseCheckboxModel model) {
return new Observable[]{model.TestCaseName, model.TestCaseStatus, model.TestCaseSelected};//selected might not be needed since it's bound to the listview anyways
}
});
}
リストが使用するクラスは、これらのプロパティがあります。
public StringProperty TestCaseName = new SimpleStringProperty();
public IntegerProperty TestCaseStatus = new SimpleIntegerProperty();
public BooleanProperty TestCaseSelected = new SimpleBooleanProperty();
一覧を外部から移入されます。
ListView
:
@FXML
private ListView<TestCaseCheckboxModel> testcaseListView;
//bind the checkbox select to the model property
testcaseListView.setCellFactory(CheckBoxListCell.forListView(new Callback<TestCaseCheckboxModel, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TestCaseCheckboxModel item) {
return item.TestCaseSelected;
}
}));
//initiate the checkbox list view with the model items
testcaseListView.setItems(getModel().TestCases);
問題は、私はリストの項目を変更すると、リストビューが古いJavaFXのバージョンに変更されないことです。
リストからアイテムを追加/削除した後、リスト内のアイテムが変更されたときのように更新されることには言及する価値があります。しかし、私が知る限り、リストのadd
関数を呼び出すと、ListView
の更新がトリガーされます。既知の回避策は、のためにあるの
getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){
@Override
public void onChanged(Change change) {
System.out.println(change);
}
});
:アイテムのプロパティが変更されたときに一方
が、これは意図したとおりCallback
抽出が働いているので、古いものと新しいJavaFXのバージョンの両方で、トリガされますこの?
ありがとうございました。このスレッドからの助けを借りて自分の質問に答える
データを変更するサンプルコードを投稿できますか?さらに**これらのプロパティフィールドを 'public'にする場合は、プロパティが置き換えられないように' final'修飾子を追加する必要があります。 – fabian
提案していただきありがとうございます、私は間違いなく安全対策を組み込んでいますが、私はむしろこの問題を最初から解決したいと考えていました。例としては単に 'getModel()。TestCases.get(0).TestCaseName.set(" New name ")'とすることができます。このように、プロパティのいずれかは 'TestCases'リストから変更することができます。だから特別なトリックはありません。 –
そして、データを変更する際にエラーが発生したのかどうか疑問に思っていたら、私が投稿した答えを確認して問題を解決してください。そうではなく、解決策も見つけました(下記の回答)。できるだけ早くそれを受け入れて(明後日)、それは明白になるでしょう。 –