События JavaFX Drag&Drop на Gridpanes

Я пытался сделать Drag&Drop-Event на панели сетки, но это не сработало. Перетаскивание обнаружено, но ни перетаскивание, ни событие сброса. Что я делаю не так?

Вот код, который я попробовал:

public class FXMLDocumentController implements Initializable {

    @FXML
    private GridPane grid;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        StackPane sourcePane = new StackPane(new Text("Source"));    
        StackPane targetPane = new StackPane(new Text("Target"));        

        sourcePane.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                sourcePane.startDragAndDrop(TransferMode.ANY);
                System.out.println("Drag detected");
                event.consume();
            }
        });


        targetPane.setOnDragOver(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                event.acceptTransferModes(TransferMode.ANY);
                System.out.println("Drag over detected");
                event.consume();
            }
        });

        targetPane.setOnDragDropped(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                event.acceptTransferModes(TransferMode.ANY);
                System.out.println("Drop detected");
                event.consume();
            }
        });

        grid.add(sourcePane, 1, 1);
        grid.add(targetPane, 0, 1);
    }        
}

1 ответ

Решение

Вам нужно добавить некоторый контент в после startDragAndDrop(), например.:

    sourcePane.setOnDragDetected(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            Dragboard db = sourcePane.startDragAndDrop(TransferMode.ANY);
            ClipboardContent content = new ClipboardContent();
            content.putString("Hello!");
            db.setContent(content);
            System.out.println("Drag detected");
            event.consume();
        }
    });

Смотрите страницу Oracle на DragEvent:
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/DragEvent.html

Другие вопросы по тегам