package bugs; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.embed.swing.JFXPanel; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.VBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class JFXPanelDnD { private final StringProperty draggingContent ; public JFXPanelDnD() { draggingContent = new SimpleStringProperty(); } private void initAndShowGUI() { // Execute on EDT thread final JFrame frame = new JFrame("DnD Between JFX Panels"); final JFXPanel leftPanel = new JFXPanel(); final JFXPanel rightPanel = new JFXPanel(); final JPanel panel = new JPanel(); panel.add(leftPanel); panel.add(rightPanel); frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(420, 320); frame.setLocationRelativeTo(null); frame.setVisible(true); Platform.runLater(new Runnable() { @Override public void run() { configureLeftPanel(leftPanel); configureRightPanel(rightPanel); } }); } private void configureLeftPanel(JFXPanel panel) { // Execute on JavaFX Application thread final TextField textField = new TextField(); final VBox root = new VBox(); root.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent event) { System.out.println("Drag detected"); Dragboard db = root.startDragAndDrop(TransferMode.ANY); System.out.println(db); ClipboardContent content = new ClipboardContent(); content.putString(textField.getText()); db.setContent(content); draggingContent.set(textField.getText()); event.consume(); } }); root.setOnDragDone(new EventHandler() { @Override public void handle(DragEvent event) { draggingContent.set(null); } }); root.getChildren().add(textField); Scene scene = new Scene(root, 200, 300); panel.setScene(scene); } private void configureRightPanel(JFXPanel panel) { final Label label = new Label("Text"); final VBox root = new VBox(); root.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent event) { final Dragboard dragboard = event.getDragboard(); System.out.println(dragboard); // if (dragboard.hasString()) { // event.acceptTransferModes(TransferMode.COPY); // } else { // System.out.println("No string content"); // } if (draggingContent.get() != null) { event.acceptTransferModes(TransferMode.COPY); } } }); root.setOnDragDropped(new EventHandler(){ @Override public void handle(DragEvent event) { // Dragboard db = event.getDragboard() ; // if (db.hasString()) { // label.setText(db.getString()); // event.setDropCompleted(true); // } else { // event.setDropCompleted(false); // } if (draggingContent.get()==null) { event.setDropCompleted(false); } else { label.setText(draggingContent.get()); event.setDropCompleted(true); } event.consume(); } }); root.getChildren().add(label); Scene scene = new Scene(root, 200, 300); panel.setScene(scene); } public static void main(String[] args) { final JFXPanelDnD test = new JFXPanelDnD(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { test.initAndShowGUI(); } }); } }