2017-07-19 3 views
0

私はListViewを持っていて、そのselectedItemProperty()にはChangeListenerが追加されています。リスナーの内側にいくつかの条件がtruefor例である場合は、リスナーを無効にする何とか可能です:JavaFx:ChangeListenerを無効にする

listView.getSelectionModel().selectedItemProperty().addListener(
      (observable, oldValue, newValue) -> { 
       if (thereIsUnsavedData()) { 
        // invalidate somehow so to don't change from item A to B 
       } else{ 
        // load the content of the newValue 
       } 
      }); 
私は条件が真であるが、それでも listViewでの選択が変化し、それがないときは何もしないでくださいその作ることができ

listView.getSelectionModel()への解答。select(oldValue);それはリスナーを再びトリガするからです。

編集:

は、だから私は、いくつかの誤解がある見るので、それらを明確にすることができます:

現在と現在のビューにないlistView内の他の要素をユーザーがクリックすると保存されていないデータのときDialogがポップアップし、ユーザーに尋ねます:保存していないデータがありますか?はい/いいえの回答。ユーザーがはいを選択した場合はすべてに変更しますが、を選択した場合はと表示されます。私の場合、要素を無効にするための提案は間違っています。私はそれがここに解決策を見つけたが、私はそれが最適であるかどうかについてはよく分からない:

private ChangeListener<Item> changeListener = 
     (observable, oldValue, newValue) -> { 
      if (thereAreUnsavedData()) { 
       listView.getSelectionModel().selectedItemProperty().removeListener(getListener()); 
       Platform.runLater(() -> { 
        listView.getSelectionModel().select(oldValue); 
        listView.getSelectionModel().selectedItemProperty().addListener(getListener()); 
       }); 
      } else { 
       loadSelected(newValue); 
      } 
     }; 
+0

SelectionModel.selectedItemは[読み取り専用のプロパティ](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#selectedItemProperty)であることを考慮すると、あなたがその価値に影響を与えることができると思います。また、標準コントロールの動作を変更すると、ユーザーが不満を感じる可能性があることにも注意してください。 – VGR

+0

私はその値を変更したくないのですが、質問でわかるように、条件が真であれば項目から別の項目への変更をやめてください。 – Sunflame

+0

あなたは、「保存していないデータ」を選択することができないようにあなた自身の 'SelectionModel'を書くこともできます – Jibbow

答えて

0

だから、私はお勧めしません2つの解決策があります。

  • 使用listView.getSelectionModel().select(oldValue);にそれを設定するためには、古い値ですが、以前にリスナーを登録解除してから登録し直してください。
  • また、listView.getSelectionModel().select(oldValue);を使用しますが、リスナーを再度トリガーするときにチェックするフラグを設定します。

どちらの解決法もエラーを起こしやすい。

したがって、私が推奨する解決策は、リスト内の項目を削除するか、または無効にして、現在意味をなさない選択をユーザーが妨げることです。これにより、アプリケーションの選択が取り消されたときにユーザーが不満を感じることがないため、アプリケーションのユーザビリティが向上します。

+0

私はあなたが最初のポイントで言及したのと似たようなものを作ったので、リスナを '.select()'の前に削除してもう一度追加します。私は次のようなメッセージで 'Dialog'を持っています:データは保存されませんでしたか?はい/いいえの回答で、ユーザーがいいえを押すと、listViewの選択を変更しないとします。 – Sunflame

+0

しかしこれにはもっと良い解決策があるはずです。 – Sunflame

+1

Usabilityの観点からは、選択が意味をなさない場合、アイテムを無効にします。例えば[ここ](http:// stackoverflow。com/questions/43998613/javafx-listview-disable-a-specified-of-the-list)を参照してください。 選択が変更されてデータが失われた場合、バックグラウンドのデータを覚えておき、ユーザーが以前の選択に戻ると、この再解析されたデータを再度使用します。 私が言ったように、あなたはあなたのユーザーインターフェイスのデザインを思うかもしれません。 – mik

関連する問題