JavaFX Treeview返回所选项目

时间:2016-05-30 18:11:42

标签: javafx treeview selection

我想在TreeView中进行选择并返回相应的模型对象。所有关于此的答案都表明这是通过内部类或lambda表达式完成的。但是,当我这样做时,编译器提醒我变量必须(有效)最终。我理解,为什么会这样,但我不知道解决这个问题。

注意:我实际上不确定,为什么这种情况首先需要一个监听器,因为我甚至不想经常听,而是在调用方法时得到结果。

    private CampaignObject getLeadSelect(){
    CampaignObject co = null;

    campTree.getSelectionModel().selectedItemProperty().addListener(
        new ChangeListener<TreeItem <CampaignObject>>() {
            @Override
            public void changed(ObservableValue<? extends TreeItem<CampaignObject>> observableValue, 
                    TreeItem<CampaignObject> oldItem, TreeItem<CampaignObject> newItem) {
                    co = newItem.getValue());
        }
    });

    return co;
}

1 个答案:

答案 0 :(得分:6)

如果您不需要听众,请不要定义听众。听起来你只需要

private CampaignObject getLeadSelect(){
    TreeItem<CampaignObject> selectedItem = campTree.getSelectionModel().getSelectedItem();
    return selectedItem == null ? null : selectedItem.getValue() ;
}

如果您启用了多个选择并想要选择的模型对象列表,请执行

private List<CampaignObject> getAllSelected() {
    return campTree.getSelectionModel().getSelectedItems()
           .stream()
           .map(TreeItem::getValue)
           .collect(Collectors.toList());
}

如果要将所选项目视为模型对象,可以执行以下操作:

ObjectProperty<CampaignObject> selectedCampaign = new SimpleObjectProperty<>();
selectedCampaign.bind(Bindings.createObjectBinding(() -> {
    TreeItem<CampaignObject> selectedItem = campTree.getSelectionModel().getSelectedItem();
    return selectedItem == null ?  null : selectedItem.getValue();
}, campTree.getSelectionModel().selectedItemProperty()));

然后你可以做像

这样的事情
selectedCampaign.addListener((obs, oldCampaign, newCampaign) -> {
    // ...
});