使用CheckBoxListCell的Javafx listview不适用于拖放

问题描述 投票:0回答:1

我有一个qazxsw poi,带有一个名为qazxsw poi的自定义CheckBox项目。一切看起来不错,但现在我需要实现拖放以便于排序。

我知道我必须使用自定义ListView并将拖放事件设置为单元格本身。我的问题是我已经有一个CheckBoxListItem并且不知道如何添加事件。

评论的代码是我认为可能的方式,但CellFactory方法不起作用。


我的主要课程:

CellFactory

和CheckBoxListItem.java:

updateItem
java listview javafx checkbox drag-and-drop
1个回答
1
投票

解决方案是你必须结合你的方法。您只能模仿CheckBoxListCell.forListView()内部的功能。即,使用observableProperty和转换器创建一个新的CheckBoxListCell。我只是将您的演示重新编码到下面,它按预期工作。

public class Main extends Application{

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {

        ListView<CheckBoxListItem> listView = new ListView<>();
        ScrollPane scrollPane = new ScrollPane(listView);
        scrollPane.setFitToHeight(true);
        scrollPane.setFitToWidth(true);

        for(int i=1; i<15; i++) {
            listView.getItems().add(new CheckBoxListItem("Value"+i));
        }

        listView.setCellFactory(CheckBoxListCell.forListView(CheckBoxListItem::selectedProperty, new StringConverter<    CheckBoxListItem>() {
            @Override
            public String toString(CheckBoxListItem object) {
                return object.getName();
            }

            @Override
            public CheckBoxListItem fromString(String string) {
                return null;
            }
        }));

        /*
        ObjectProperty<CheckBoxListCell<CheckBoxListItem>> dragSource = new SimpleObjectProperty<>();
        listView.setCellFactory(lv -> {
            CheckBoxListCell<CheckBoxListItem> cell = new CheckBoxListCell<CheckBoxListItem>(){
                @Override
                public void updateItem(CheckBoxListItem item , boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null) {
                        setGraphic(null);
                    }else {
                        setGraphic(?????);
                    }
                }
            };

            cell.setOnDragDetected(event -> {
                //TODO
            });
            cell.setOnDragOver(event -> {
                //TODO
            });
            cell.setOnDragDropped(event -> {
                //TODO
            });
            return cell ;
        });
        */

        Scene scene = new Scene(scrollPane, 350, 450);
        stage.setScene(scene);
        stage.show();
    }

    @Override
    public void stop() {
        System.exit(0);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.