JavaFx:ListView删除最后一项错误?

时间:2018-01-29 14:24:34

标签: java listview javafx javafx-8 selection

我发现了一个问题,我不确定它是否是错误或功能,但我想为以下问题找到答案和优雅的解决方案:

我有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);
    }
}

0 个答案:

没有答案