import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage; 

import javax.swing.*;

import java.awt.*;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragSource;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class DnDTestSwingNode extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(getMainJavaFxScene());
        stage.show();
    } 

  public static void main(final String[] args) {
    launch(args);
  } 

    private static Scene getMainJavaFxScene() {
        BorderPane root = new BorderPane();
        SwingNode node = new SwingNode();
        root.setCenter(node);
        node.setContent(createIntermediateSwingLayer());
        return new Scene(root);
    } 

    private static JComponent createIntermediateSwingLayer() {
        JFrame frame = new JFrame("DnDTest");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JRootPane rootPane = frame.getRootPane();
        rootPane.setLayout(new FlowLayout());
        JLabel label = new JLabel("Drag me");
        label.setTransferHandler(new TransferHandler() {
          @Override
          protected Transferable createTransferable(final JComponent pComponent) {
            return new StringSelection("Drag text");
          }

          @Override
          public int getSourceActions(final JComponent pComponent) {
            return DnDConstants.ACTION_COPY;
          }
        });
        MouseAdapter dragGestureRecognizer = new MouseAdapter() {
          private Point mPoint;

          @Override
          public void mousePressed(MouseEvent pEvent) {
System.out.println("mousePressed");
            mPoint = pEvent.getPoint();
          }

          @Override
          public void mouseReleased(MouseEvent pEvent) {
System.out.println("mouseReleased");
            mPoint = null;
          }

          @Override
          public void mouseDragged(MouseEvent pEvent) {
System.out.println("mouseDragged");
            if (mPoint == null) {
              mPoint = pEvent.getPoint();
            }
            double distance = pEvent.getPoint().distance(mPoint);
            if (distance > DragSource.getDragThreshold()) {
              JComponent component = (JComponent) pEvent.getComponent();
              TransferHandler transferHandler = component.getTransferHandler();
              transferHandler.exportAsDrag(component, pEvent, DnDConstants.ACTION_COPY);
            }
          }
        };
        label.addMouseListener(dragGestureRecognizer);
        label.addMouseMotionListener(dragGestureRecognizer);
        rootPane.add(label);
        rootPane.add(new JTextField("Drop works here"));
        rootPane.add(createJFXPanel());
        return rootPane; 
    }

    private static JFXPanel createJFXPanel() {
        JFXPanel jfxPanel = new JFXPanel();
        Platform.runLater(() -> {
            TextField textField = new TextField("Drop doesn't work here");
            HBox hBox = new HBox();
            HBox.setHgrow(textField, Priority.ALWAYS);
            Scene jfxPanelScene = new Scene(hBox);
            hBox.getChildren().add(textField);
            jfxPanel.setScene(jfxPanelScene);
        });
        return jfxPanel;
    }
   

} 
