Просмотр списка Javafx с CheckBoxListCell не работает с перетаскиванием - PullRequest
0 голосов
/ 21 марта 2019

У меня есть ListView с пользовательским элементом CheckBox под названием CheckBoxListItem.Все выглядит хорошо, но теперь мне нужно реализовать Drag and Drop для упрощения сортировки.

Я знаю, что мне нужно использовать пользовательский CellFactory и установить Drag and Drop Events в самой ячейке.Моя проблема в том, что у меня уже есть 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);
    }

}

и CheckBoxListItem.java:

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

1 Ответ

1 голос
/ 22 марта 2019

Решение - это то, что вы должны объединить оба ваших подхода. Вы можете просто подражать тому, что внутри делает CheckBoxListCell.forListView (). то есть создание нового CheckBoxListCell с observableProperty и конвертером. Я просто переделал ваше демо ниже, и оно работает как положено.

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...