带有CheckBoxListCell的Javafx listview不适用于拖放

时间:2019-03-21 15:38:31

标签: java listview javafx checkbox drag-and-drop

我有一个CheckBoxListItem和一个名为CellFactory的自定义CheckBox项。一切看起来都很不错,但现在我需要实现拖放操作,以便于排序。

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

我认为注释的代码可能是这样做的方法,但是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); } } 方法不起作用。


我的主班:

public class CheckBoxListItem {
    private ReadOnlyStringWrapper name = new ReadOnlyStringWrapper();
    private BooleanProperty selected = new SimpleBooleanProperty(false);

    public CheckBoxListItem(String name) {
        this.name.set(name);
    }

    public CheckBoxListItem(String name, boolean selected) {
        this.name.set(name);
        this.selected.set(selected);
    }

    public String getName() {
        return name.get();
    }

    public BooleanProperty selectedProperty() {
        return selected;
    }

    public boolean isSelected() {
        return selected.get();
    }

    public void setSelected(boolean selected) {
        this.selected.set(selected);
    }
}

和CheckBoxListItem.java:

LPAD(your_col::text, 4, '0')

1 个答案:

答案 0 :(得分:1)

解决方案是您必须结合两种方法的解决方案。您只能模仿CheckBoxListCell.forListView()内部执行的操作。也就是说,使用observableProperty和转换器创建一个新的CheckBoxListCell。我只是将您的演示重新修改为下面的示例,它可以正常工作。

import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.stage.Stage;
import javafx.util.StringConverter;

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::selectedProperty, new StringConverter<CheckBoxListItem>() {
                @Override
                public String toString(CheckBoxListItem object) {
                    return object.getName();
                }

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

            cell.setOnDragDetected(event -> {
                System.out.println("Detected fired...");
            });
            cell.setOnDragOver(event -> {
                System.out.println("DragOver fired...");
            });
            cell.setOnDragDropped(event -> {
                System.out.println("DragDropped fired...");
            });
            return cell;
        });


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

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

}