
import java.awt.GridLayout;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class SwingFXDnDTest extends Application {

    @Override
    public void start(Stage stage) {
        final SwingNode swingNode = new SwingNode();

        createSwingContent(swingNode);

        StackPane pane = new StackPane();
        pane.getChildren().add(swingNode);

        stage.setTitle("JavaFX Sample App");
        stage.setScene(new Scene(pane, 800, 600));
        stage.show();
    }
    private static JPanel createPanel() {
        JButton button = new JButton("Click Here!");
        JTextField field = new JTextField("Text");
        JPanel p = new JPanel(new GridLayout(1, 2));
        field.setDragEnabled(true);

        DragGestureListener dgListener = new DragGestureListener() {
            @Override
            public void dragGestureRecognized(DragGestureEvent dge) {
                System.out.println("drag recognized...");
                dge.startDrag(java.awt.Cursor
                                .getPredefinedCursor(java.awt.Cursor.HAND_CURSOR),
                        new StringSelection("some string data"));
                System.out.println("drag finished");
            }
        };
        DropTargetListener dropListener = new DropTargetAdapter() {

            @Override
            public void drop(DropTargetDropEvent dtde) {
// never gets here
                System.out.println("drop... " + dtde.getTransferable());
            }
        };

        DragSource dragSource = new DragSource();
        Object dragRecognizer = dragSource.createDefaultDragGestureRecognizer(
                p, DnDConstants.ACTION_COPY_OR_MOVE, dgListener);
        DropTarget dropTarget = new DropTarget(p, dropListener);

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button Clicked!!!");
            }
        });


        p.add(button);
        p.add(field);

        return p;
    }

    private void createSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JButton button = new JButton("Click Here!");
                JTextField field = new JTextField("Text");
                JPanel p = new JPanel(new GridLayout(1, 2));
                p.add(button);
                p.add(field);
                swingNode.setContent(p);

                DragGestureListener dgListener = new DragGestureListener() {
                    @Override
                    public void dragGestureRecognized(DragGestureEvent dge) {
                        System.out.println("drag recognized...");
                        dge.startDrag(java.awt.Cursor
                                        .getPredefinedCursor(java.awt.Cursor.HAND_CURSOR),
                                new StringSelection("some string data"));
                        System.out.println("drag finished");
                    }
                };
                DropTargetListener dropListener = new DropTargetAdapter() {

                    @Override
                    public void drop(DropTargetDropEvent dtde) {
// never gets here
                        System.out.println("drop... " + dtde.getTransferable());
                    }
                };

                DragSource dragSource = new DragSource();
                Object dragRecognizer = dragSource.createDefaultDragGestureRecognizer(
                        field, DnDConstants.ACTION_COPY_OR_MOVE, dgListener);
                DropTarget dropTarget = new DropTarget(p, dropListener);
                System.out.println(dragRecognizer);
                System.out.println(dropTarget);
            }
        });
    }
    public static void main(String[] args) {
        boolean testFX = true;

        if (testFX)
            Application.launch(args);
        else {
            SwingUtilities.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setSize(200, 200);
                frame.setContentPane(createPanel());
                frame.setVisible(true);
            });
        }
    }

}
