簡體   English   中英

JavaFX 8,帶有復選框滾動窗格的ListView問題

[英]JavaFX 8, ListView with Checkboxes scrollpane issue

我正在將單元格工廠用於帶有以下復選框的listview:

  listView.setCellFactory(CheckBoxListCell.forListView(new Callback < Bean, ObservableValue < Boolean >> () {
  @Override
  public ObservableValue < Boolean > call(Bean item) {
    BooleanProperty observable = new SimpleBooleanProperty();
    observable.addListener((obs, wasSelected, isNowSelected) -> {
      if (isNowSelected) {
        if (!beanChoices.contains(item.toString())) {
          beanChoices.add(item.toString());
          observable.setValue(true);
          //listView.scrollTo(listView.getItems().size() - 1);
        }
      } else if (wasSelected) {
        if (beanChoices.contains(item.toString())) {
          beanChoices.remove(item.toString());
          observable.setValue(false);
        }
      }
    });
  /* [Code] which compares values with bean item string value and select observable to true for that for edit mode
    but here the observer not called for beanItem that are under scrollpane of listview. But on scroll it gets called. */
    return observable;
  }
}));

它工作正常,但不適用於所有情況。 案例:當我說了10個以上的條目時,就會出現滾動窗格。 假設我要檢查的beanChoices的索引為8或9(必須滾動查看它們)。
對於不可見的項(在滾動窗格下),不會調用偵聽器。
在Debug上,我發現向下滾動時會調用偵聽器。

問題:當我從beanChoices獲取上述情況的檢查值時,它返回空。
詳細信息:我有需要選擇listView項目(編輯模式)的beanChoices。 當我更新時不做任何更改。 (假設將選擇列表視圖的滾動窗格下的值並將其添加到beanChoices中)

當項目與單元格相關聯時, Callback將用於檢索選中狀態的屬性。 該物品可隨時從牢房中取出並放入新的物品中。 這就是ListView (以及類似TableView類似控件)的工作方式。 每當新項目與單元格關聯時, CheckBoxListCell簡單地獲取選中狀態屬性。

返回值還用於設置CheckBox的初始狀態。 由於未正確使用正確的值初始化屬性,因此不會保留初始狀態。

還要注意,在更改偵聽器中將屬性的值更新為新值幾乎沒有意義。 無論如何都會發生。

由於BooleanProperty是原始boolean值的包裝器,因此可能的值為truefalse 只有當!Objects.equals(oldValue, newValue)可以確定isNowSelected = !wasSelected時, ChangeListener才被調用。

當然,您還需要返回該值:

@Override
public ObservableValue < Boolean > call(Bean item) {
    final String value = item.toString();
    BooleanProperty observable = new SimpleBooleanProperty(beanChoices.contains(value));
    observable.addListener((obs, wasSelected, isNowSelected) -> {
        if (isNowSelected) {
            beanChoices.add(value);
        } else {
            beanChoices.remove(value);
        }
    });
    return observable;
}

我還建議使用BeanCollection而不是依賴於對象的字符串表示形式。 toString不會產生唯一的結果,而Beans.equals是比較對象的更好選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM