2017-06-16 64 views
0

我在我的FXML文件中定義了一個ListView,該文件將保存MyCustomData對象。我可以找出如何告訴它,以顯示其MyCustomData財產的唯一方法是將以下代碼添加到我的控制器:如何指定使用自定義對象時JavaFX ListView應顯示的屬性?

myList.setCellFactory(new Callback<ListView<MyCustomData>, ListCell<MyCustomData>>() { 
    @Override 
    public ListCell<MyCustomData> call(ListView<MyCustomData> param) { 
     return new ListCell<MyCustomData>() { 
      @Override 
      protected void updateItem(MyCustomData item, boolean empty) { 
       super.updateItem(item, empty); 
       if(item != null) { 
        setText(item.getMyProperty()); 
       } 
      } 
     }; 
    } 
}); 

這肯定將是很好用單來代替這一切亂碼在FXML中指定應顯示的屬性。這可能嗎?

回答

1

首先注意你的單元實現有一個bug。您需要必須處理updateItem(...)方法中的所有可能性。在您的實現中,如果單元格當前顯示一個項目,然後作爲空單元格重用(例如,如果項目被刪除),那麼單元格將不會清除其文本。

可以顯著減少代碼量如果實現了Callback作爲lambda表達式,而不是匿名內部類:

myList.setCellFactory(lv -> new ListCell<MyCustomData>() { 
    @Override 
    protected void updateItem(MyCustomData item, boolean empty) { 
     super.updateItem(item, empty); 
     setText(item == null ? null : item.getMyProperty()); 
    } 
}); 

如果你是做了很多這方面,並希望減少代碼量進一步,這不是努力創造一個可重複使用的通用電池工廠實現:

public class ListViewPropertyCellFactory<T> 
    implements Callback<ListView<T>, ListCell<T>> { 

    private final Function<T, String> property ; 

    public ListViewPropertyCellFactory(Function<T, String> property) { 
     this.property = property ; 
    } 

    @Override 
    public ListCell<T> call(ListView<T> listView) { 
     return new ListCell<T>() { 
      @Override 
      protected void updateItem(T item, boolean empty) { 
       super.updateItem(item, boolean); 
       setText(item == null ? null : property.apply(item)); 
      } 
     }; 
    } 
} 

,你可以用

使用

如果你喜歡一個更實用的風格,以創建實現Callback一類,你可以做同樣

public class ListViewPropertyCellFactory { 

    public static <T> Callback<ListView<T>, ListCell<T>> of(Function<T, String> property) { 
     return lv -> new ListCell<T>() { 
      @Override 
      protected void updateItem(T item, boolean empty) { 
       super.updateItem(item, boolean) ; 
       setText(item == null ? null : property.apply(item)); 
      } 
     }; 
    } 
} 

myList.setCellFactory(ListViewPropertyCellFactory.of(MyCustomData::getMyProperty)); 
相關問題