Методы перетаскивания не срабатывают

У меня есть кнопка и панель стека. Теперь я хочу иметь возможность перетаскивать эту кнопку на эту панель стека:

Методы перетаскивания не срабатывают

В целях тестирования я добавил все возможные события перетаскивания в оба компонента:

Методы перетаскивания не срабатывают

FXML:

<AnchorPane id = "AnchorPane" prefHeight = "400.0" prefWidth = "600.0" xmlns = "http://javafx.com/javafx/11.0.1" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "controller.TestController">
   <children>
      <Button fx:id = "source" layoutX = "119.0" layoutY = "172.0" mnemonicParsing = "false" onDragDetected = "#dragDetected" onDragDone = "#dragDone" onDragDropped = "#dragDropped" onDragEntered = "#dragEntered" onDragExited = "#dragExited" onDragOver = "#dragOver" onMouseDragEntered = "#mouseDragEntered" onMouseDragExited = "#mouseDragExited" onMouseDragOver = "#mouseDragOver" onMouseDragReleased = "#mouseDragReleased" text = "Drag Me!" />
      <StackPane fx:id = "stackPane" layoutX = "237.0" layoutY = "110.0" onDragDetected = "#dragDetected" onDragDone = "#dragDone" onDragDropped = "#dragDropped" onDragEntered = "#dragEntered" onDragExited = "#dragExited" onDragOver = "#dragOver" onMouseDragEntered = "#mouseDragEntered" onMouseDragExited = "#mouseDragExited" onMouseDragOver = "#mouseDragOver" onMouseDragReleased = "#mouseDragReleased" prefHeight = "150.0" prefWidth = "200.0" style = "-fx-border-color: black; -fx-background-color: lightgray;" />
   </children>
</AnchorPane>

Контроллер:

package controller;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.input.DragEvent;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;

public class TestController implements Initializable {

    @FXML
    private Button source;
    @FXML
    private StackPane stackPane;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }

    @FXML
    private void mouseDragEntered(MouseDragEvent event) {
        System.out.println("mouseDragEntered");
    }

    @FXML
    private void mouseDragExited(MouseDragEvent event) {
        System.out.println("mouseDragExited");
    }

    @FXML
    private void mouseDragReleased(MouseDragEvent event) {
        System.out.println("mouseDragReleased");
    }

    @FXML
    private void mouseDragOver(MouseDragEvent event) {
        System.out.println("mouseDragOver");
    }

    @FXML
    private void dragDetected(MouseEvent event) {
        System.out.println("dragDetected");
    }

    @FXML
    private void dragEntered(DragEvent event) {
        System.out.println("dragEntered");
    }

    @FXML
    private void dragDone(DragEvent event) {
        System.out.println("dragDone");
    }

    @FXML
    private void dragExited(DragEvent event) {
        System.out.println("dragExited");
    }

    @FXML
    private void dragOver(DragEvent event) {
        System.out.println("dragOver");
    }

    @FXML
    private void dragDropped(DragEvent event) {
        System.out.println("dragDropped");
    }

}

Когда я перетаскиваю кнопку, срабатывает только функция dragDetected. Все последующие шаги (например, dragOver, dragDone и т. д.) не будут распознаны.

Прикрепили ли вы какие-либо методы к целевому узлу? docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.htm‌​l

Sedrick 29.05.2019 16:36

@Sedrick: Да, конечно: «Я добавил все возможные события перетаскивания в компоненты обе»

Evgenij Reznik 29.05.2019 16:43

Смотрите мой следующий комментарий.

Sedrick 29.05.2019 16:44

@Sedrick: больше нечего добавить. Только остальные DaD-методы, но все они имеют одну и ту же структуру.

Evgenij Reznik 29.05.2019 16:46

Является ли код, который вы разместили, примером Minimal, Complete, Verifiable?

Sedrick 29.05.2019 16:46

@Sedrick: Хорошо, я добавил весь код, необходимый для воспроизведения моего примера.

Evgenij Reznik 29.05.2019 16:50

Дополнительные сведения о жестах мыши см. в статье документация MouseEvent. Обратите внимание, что MouseDragEvent соответствует «полный пресс-релиз», а DragEvent соответствует «перетаскивание». Однако эти режимы необходимо активировать, иначе по умолчанию используется «простой пресс-перетаскивание-релиз», в котором используются обычные MouseEvents.

Slaw 30.05.2019 09:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавлять

Dragboard db = source.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString(source.getText());
db.setContent(content);
event.consume();

к dragDetected.

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