我发现了一个问题,我不确定它是否是错误或功能,但我想为以下问题找到答案和优雅的解决方案:
我有ListView
SelectionMode.MULTIPLE
我有一个按钮,可以从列表视图中删除所选项目。问题是在我删除最后一个元素后,列表listView.getSelectionModel().getSelectedItems()
为空,而listView.getSelectionModel().getSelectedItem()
不是 null
。
仅当我从listView中删除最后一个元素或范围中的最后一个元素时才会发生这种情况。
我的java版本是8u121。
有人知道这个问题吗?这是一个功能还是一个bug? 有没有适当的解决方案?
我的目的是处理按钮的启用/禁用状态,具体取决于selectedItems的属性。
以下是一个简单的例子,您可以查看它:
public class Controller implements Initializable {
@FXML
public ListView<Model> listView;
@FXML
public Button button;
@Override
public void initialize(URL location, ResourceBundle resources) {
initListView();
button.setOnAction(event -> listView.getItems().removeAll(listView.getSelectionModel().getSelectedItems()));
listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
System.out.println(listView.getSelectionModel().getSelectedItem() == null);
System.out.println(listView.getSelectionModel().getSelectedItems().isEmpty());
});
}
private void initListView() {
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
listView.getItems().add(new Model("Test"));
}
private class Model {
private StringProperty test;
public Model(String test) {
this.test = new SimpleStringProperty(test);
}
public String getTest() {
return test.get();
}
public StringProperty testProperty() {
return test;
}
}
}
View.fxml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="stackoverflow.three.Controller">
<ListView fx:id="listView"/>
<Button fx:id="button" text="Remove"/>
</VBox>
Main
类:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
VBox pane = loader.load();
primaryStage.setScene(new Scene(pane, 300, 500));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}