JavaFX ListView selectedItemProperty未在clearSelection(索引)时触发

JavaFX ListView selectedItemProperty未在clearSelection(索引)时触发,java,listview,user-interface,javafx,multipleselection,Java,Listview,User Interface,Javafx,Multipleselection,我正在使用JavaFX作为我正在编写的应用程序的GUI。我的GUI中有一个ListView和一个按钮 我希望ListView在鼠标单击时保持多个选择,并且仅在再次单击时删除选择(此操作有效)。 我还需要验证是否在ListView中选择了某些内容,如果未启用任何内容,则禁用该按钮(适用于选择,但不适用于取消选择)。 以下是我的按钮启用和禁用代码(这不起作用): 以下是我捕获鼠标选择的代码(这是有效的,由fabian根据SO answer开发的解决方案): 以下是我运行应用程序时的输出: /

我正在使用JavaFX作为我正在编写的应用程序的GUI。我的GUI中有一个ListView和一个按钮

我希望ListView在鼠标单击时保持多个选择,并且仅在再次单击时删除选择(此操作有效)。

我还需要验证是否在ListView中选择了某些内容,如果未启用任何内容,则禁用该按钮(适用于选择,但不适用于取消选择)。

以下是我的按钮启用和禁用代码(这不起作用):

以下是我捕获鼠标选择的代码(这是有效的,由fabian根据SO answer开发的解决方案):

以下是我运行应用程序时的输出:

    //Before click, button disabled
    No individual item selected? true
    Selected items: []

    //First click selecting a cell, button enabled
    Selecting...
    No individual item selected? false
    Selected items: [SV124]
    Selected

    //Second click deselecting the first selected cell, button stays
    //enabled as the BooleanBinding never fires
    Clear selection...
    Selection cleared

为什么
BooleanBinding
不能在
listView.getSelectionModel().clearSelection(cell.getIndex())上启动?或者更直接地说,
listView.getSelectionModel().selectedItemProperty()
为什么在选择为空时不触发?根据Javadoc,它应该在为空时返回null,所以不应该捕获它吗

从列表视图的选择模型中删除选定索引似乎无法使
selectedItemProperty()
无效。(这似乎是一个bug。)

如果您绑定到
selectedIndex属性而不是
selectedItemProperty
,则该属性有效:

BooleanBinding validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().selectedIndexProperty());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};
也许,由于您启用了多个选择,因此最好还是绑定到所选项目的列表:

BooleanBinding validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().getSelectedItems());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};
请注意,如果将
validEntriesBinding
设置为局部变量,则很容易出现错误。您应该将其改为字段:

private BooleanBinding validEntriesBinding ;

// ...

validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().getSelectedItems());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};

从列表视图的选择模型中删除选定索引似乎无法使
selectedItemProperty()
无效。(这似乎是一个bug。)

如果您绑定到
selectedIndex属性而不是
selectedItemProperty
,则该属性有效:

BooleanBinding validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().selectedIndexProperty());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};
也许,由于您启用了多个选择,因此最好还是绑定到所选项目的列表:

BooleanBinding validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().getSelectedItems());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};
请注意,如果将
validEntriesBinding
设置为局部变量,则很容易出现错误。您应该将其改为字段:

private BooleanBinding validEntriesBinding ;

// ...

validEntriesBinding = new BooleanBinding(){
    {
        super.bind(listView.getSelectionModel().getSelectedItems());
    }
    @Override
    protected boolean computeValue() {
        log.info("No individual item selected? " + 
                (listView.getSelectionModel().getSelectedItems().isEmpty()));
        log.info("Selected items: " + listView.getSelectionModel().getSelectedItems().toString());
        return (listView.getSelectionModel().getSelectedItems().isEmpty());
    }
};

谢谢你的快速回复!我认为现在切换到
selectedIndexProperty
应该可以帮我解决这个问题。我也采纳了你的建议,把“validEntriesBinding”列为一个字段。我是否应该将此作为一个bug与JavaFX开发人员一起打开/询问他们此场景的预期结果?感谢您的快速响应!我认为现在切换到
selectedIndexProperty
应该可以帮我解决这个问题。我也采纳了你的建议,把“validEntriesBinding”列为一个字段。我是否应该将此作为一个bug与JavaFX开发人员一起打开/询问他们此场景的预期结果?