2017-07-19 45 views
0

我有一個ListView它有一個ChangeListener添加到其selectedItemProperty()。有可能以某種方式無效聽衆,如果聽衆裏面的一些條件是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',使其無法選擇「unsave data」 – Jibbow

回答

0

所以,有兩種解決方案我不建議:

  • 使用listView.getSelectionModel().select(oldValue);將其設置爲舊的價值,但之前取消註冊聽衆並在之後註冊。
  • Alternativley也使用listView.getSelectionModel().select(oldValue);,但設置一個標誌,您會檢查它何時再次觸發偵聽器。

這兩種解決方案都很容易出錯。

因此,我建議的解決方案是通過刪除或更好地停用列表中的項目來阻止用戶做出目前沒有意義的選擇。這將改善您的應用程序的可用性,因爲用戶在選擇撤消時不會感到沮喪。

+0

我做了類似於第一點中提到的類似的東西,所以我在'.select()'之前刪除了偵聽器並將其重新添加回去。我有一個類似於以下消息的'Dialog':數據未保存,您是否希望繼續?與是/否答案,如果用戶點擊否,那麼我想不改變listView中的選擇。 – Sunflame

+0

但我認爲應該有更好的解決方案。 – Sunflame

+1

因此,從可用性的角度來看,如果選擇沒有意義,我會停用該項目。檢查例如[這裏](http:// stackoverflow。com/questions/43998613/javafx-listview-disable-a-specified-element-of-the-list)以瞭解如何實現此目的。 如果選擇導致更改,某些數據丟失,則介意要記住背景中的數據,並且當用戶返回到先前的選擇時,再次使用該重新編排的數據。 正如我所說的,您可能想要過度考慮您的用戶界面設計。 – mik

相關問題