2016-08-17 10 views
0

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のバージョンの両方で、トリガされますこの?

ありがとうございました。このスレッドからの助けを借りて自分の質問に答える

+0

データを変更するサンプルコードを投稿できますか?さらに**これらのプロパティフィールドを 'public'にする場合は、プロパティが置き換えられないように' final'修飾子を追加する必要があります。 – fabian

+0

提案していただきありがとうございます、私は間違いなく安全対策を組み込んでいますが、私はむしろこの問題を最初から解決したいと考えていました。例としては単に 'getModel()。TestCases.get(0).TestCaseName.set(" New name ")'とすることができます。このように、プロパティのいずれかは 'TestCases'リストから変更することができます。だから特別なトリックはありません。 –

+0

そして、データを変更する際にエラーが発生したのかどうか疑問に思っていたら、私が投稿した答えを確認して問題を解決してください。そうではなく、解決策も見つけました(下記の回答)。できるだけ早くそれを受け入れて(明後日)、それは明白になるでしょう。 –

答えて

1

https://stackoverflow.com/a/25962110/4073727

は、私が「内側から」リストビューを更新することのできるカスタムListViewSkinを実装:

public class UpdateableListViewSkin<T> extends ListViewSkin<T> { 

    public UpdateableListViewSkin(ListView<T> arg0) { 
     super(arg0); 
    } 

    public void refresh() { 
     super.flow.recreateCells(); 
    } 

} 

その後、私はObservableListを追加しますListViewに、Skinをインスタンス化し、ListViewに設定します。

//initiate the checkbox list view with the model items 
testcaseListView.setItems(getModel().TestCases); 

UpdateableListViewSkin<TestCaseCheckboxModel> skin = new UpdateableListViewSkin<TestCaseCheckboxModel>(testcaseListView); 
testcaseListView.setSkin(skin); 

キーを使用すると、Skin.refresh()方法をトリガする、ObservableListに取り組んonChangeリスナーを追加する必要があるということです。それはJavaFXの新しいバージョンにないよう

getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){ 
    @SuppressWarnings("unchecked") 
    @Override 
     public void onChanged(Change change) { 
      ((UpdateableListViewSkin<TestCaseCheckboxModel>)testcaseListView.getSkin()).refresh(); 
     } 
    }); 

この回避策は、ListViewの更新機能をトリガ:私はListViewSkinを設定した後、私はこの権利をしました。

+0

ここで問題になるのは、Java 9では 'ListViewSkin'がパッケージを変更するため、この回避策はそのリリースでも実行されません。あなたは本当にまだJava 6をサポートする必要がありますか? –

+0

はい、私は絶対に行って、アプリケーションは日付JVMで実行する必要があります(古いMATLABバージョンはjre6を使用していますので、私の要件です)。頭をアップしてくれてありがとう、しかし、私はそれを念頭に置いて、問題が発生したときに修正を見つける。 –

関連する問題