ListView(中)

  • 设置每一个单元格的高度listView.setFixedCellSize(50);

  • 阻止获得焦点listView.setFocusTraversable(false);

  • 索引为2的元素默认获取焦点(可以和设置选中效果共存)listView.getFocusModel().focus(2);

  • 选中索引为0的元素

    效果图

  • 自定义Callback用于展示和修改listView

    Callback<ListView<Data>, ListCell<Data>> cell = TextFieldListCell.forListView(new StringConverter<Data>() {  
        @Override  
        public String toString(Data object) {  
            if (object == null) {  
                return "";  
            }  
            return object.getName();  
        }  
        @Override  
        public Data fromString(String string) {  
            return new Data(string);  
        }  
    });  
    listView.setCellFactory(cell);
    
  • 设置选中要进行编辑索引为2的数据listView.edit(2);

  • 开始修改监听

    listView.setOnEditStart(new EventHandler<ListView.EditEvent<Data>>() {  
        @Override  
        public void handle(ListView.EditEvent<Data> event) {  
            System.out.println("开始编辑");  
            System.out.println("event.getIndex() = " + event.getIndex());  
            System.out.println("event.getNewValue() = " + event.getNewValue());  
        }  
    });
    
  • 取消编辑监听(当前选中项输入框被移除是调用,也就是不管有没有条件数据都会调用)

    listView.setOnEditCancel(event -> {  
        System.out.println("取消编辑");  
    });
    
  • 完成编辑监听(使用该方法时需要手动设置新数据,该方法声明后会导致cell中的fromString方法失效)

    listView.setOnEditCommit(event -> {  
        System.out.println("完成编辑");  
        System.out.println("event.getNewValue().getName() = " + event.getNewValue().getName());  
        // 设置新数据  
        observableList.set(event.getIndex(), event.getNewValue());  
    });
    

    效果图

其他几种编辑效果

  • ComboBoxListCell

    Callback<ListView<Data>, ListCell<Data>> cell = ComboBoxListCell.forListView(new StringConverter<Data>() {  
        @Override  
        public String toString(Data object) {  
            return object.getName();  
        }  
        @Override  
        public Data fromString(String string) {  
            return new Data(string);  
        }  
    }, new Data("F"), new Data("G"));
    listView.setCellFactory(cell);
    

    效果图

  • 传入可观察列表

    ObservableList<Data> observableList1 = FXCollections.observableArrayList(observableList.subList(0, observableList.size()));  
    Callback<ListView<Data>, ListCell<Data>> cell = ComboBoxListCell.forListView(new StringConverter<Data>() {  
        @Override  
        public String toString(Data object) {  
            return object.getName();  
        }  
        @Override  
        public Data fromString(String string) {  
            return new Data(string);  
        }  
    }, observableList1);
    listView.setCellFactory(cell);
    

    效果图

  • ChoiceBoxListCell

    ObservableList<Data> observableList1 = FXCollections.observableArrayList(observableList.subList(0, observableList.size()));  
    Callback<ListView<Data>, ListCell<Data>> cell = ChoiceBoxListCell.forListView(new StringConverter<Data>() {  
        @Override  
        public String toString(Data object) {  
            return object.getName();  
        }  
        @Override  
        public Data fromString(String string) {  
            return new Data(string);  
        }  
    }, observableList1);
    listView.setCellFactory(cell);
    

    效果图

  • CheckBoxListCell(设置除了B默认选中)使用此方法进行设置可以不用将listView设置为可编辑

    ObservableList<Data> observableList1 = FXCollections.observableArrayList(observableList.subList(0, observableList.size()));  
    Callback<ListView<Data>, ListCell<Data>> cell = CheckBoxListCell.forListView(new Callback<Data, ObservableValue<Boolean>>() {  
        @Override  
        public ObservableValue<Boolean> call(Data param) {  
            SimpleBooleanProperty sbp = new SimpleBooleanProperty(true);  
            if (param.getName().equals("B")) {  
                sbp.set(false);  
            }  
            return sbp;  
        }  
    }, new StringConverter<Data>() {  
        @Override  
        public String toString(Data object) {  
            return object.getName();  
        }  
        @Override  
        public Data fromString(String string) {  
            return new Data(string);  
        }  
    });  
    listView.setCellFactory(cell);
    

    效果图