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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CheckBoxListCell的Javafx listview不适用于拖放相关的知识,希望对你有一定的参考价值。

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

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

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


我的主要课程:

CellFactory

和CheckBoxListItem.java:

updateItem
答案

解决方案是你必须结合你的方法。您只能模仿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);
    }

}

以上是关于使用CheckBoxListCell的Javafx listview不适用于拖放的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX : 使用 JavaFX 嵌入浏览器而不是可用的 webview

我不能使用 JavaFX [重复]

javaFX-使用gradle+jdk14创建javafx程序

使用 JavaFX 显示 OpenCV Mat

如何将 Spring 与 JavaFX 一起使用?

无法使用 Eclipse 运行 JavaFX 11