package dndimagetest; import java.awt.AWTException; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javafx.application.Application; import javafx.application.Platform; import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.image.Image; import javafx.scene.image.ImageViewBuilder; import javafx.scene.image.WritableImage; import javafx.scene.input.Clipboard; 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.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.stage.Window; import javax.imageio.ImageIO; public class DndImageTest extends Application { static { System.setProperty("java.awt.headless", "false"); } final static String ID_SRC_IMAGE = "SrcImage"; final static String ID_RECEIVED_IMAGE = "ReceivedImage"; final static String ID_RECEIVED_IMAGE_2 = "ReceivedImage"; Image CONTENT_IMAGE; Pane sourcePane = new VBox(getDefaultSpacing()); Pane transferedContentPane = new VBox(getDefaultSpacing()); Scene srcScene; Scene targetScene; Node srcNode; Node targetNode; Button btnScreenShot; @Override public void start(Stage stage) { CONTENT_IMAGE = new Image("file:JavaFX.png"); sourcePane.getChildren().add( ImageViewBuilder.create() .image(CONTENT_IMAGE) .id(ID_SRC_IMAGE).build()); //Set up source srcNode = new Button("Source"); srcNode.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent t) { Dragboard db = srcNode.startDragAndDrop(TransferMode.COPY); ClipboardContent content = new ClipboardContent(); content.putImage(CONTENT_IMAGE); db.setContent(content); t.consume(); } }); srcNode.setOnDragDone(new EventHandler() { @Override public void handle(DragEvent t) { System.out.println("Drag done"); } }); final Button target = new Button("Destination"); target.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent t) { if (t.getGestureSource() != target && t.getDragboard().hasImage()) { t.acceptTransferModes(TransferMode.ANY); } t.consume(); } }); target.setOnDragDropped(new EventHandler() { @Override public void handle(DragEvent t) { System.out.println("On drag dropped"); boolean result = false; if (t.getGestureSource() == target) { return; } Clipboard cb = t.getDragboard(); if (cb.hasImage()) { final Image image = cb.getImage(); System.out.println("Dropped image: " + image.toString()); transferedContentPane.getChildren().addAll( ImageViewBuilder.create() .image(image) .id(ID_RECEIVED_IMAGE).build()); result = true; } t.setDropCompleted(result); t.consume(); } }); HBox root = new HBox(getDefaultSpacing()); VBox vbLeft = new VBox(getDefaultSpacing()); vbLeft.getChildren().addAll(srcNode, sourcePane); createAndLaunchTargetWnd(); btnScreenShot = new Button("Screen shot"); btnScreenShot.setOnAction(new EventHandler() { @Override public void handle(ActionEvent t) { takeSceneScreenshots(); } }); root.getChildren().addAll(vbLeft, btnScreenShot); srcScene = new Scene(root, getSceneWidth(), getSceneHeight()); stage.setScene(srcScene); stage.setTitle(getTitle()); stage.setX(10.0); stage.show(); } public static void main(String[] args) { launch(args); } private void createAndLaunchTargetWnd() { Stage stage = new Stage(); final Pane contentPane = new VBox(getDefaultSpacing()); targetNode = new Button("Destination"); targetNode.setOnDragOver(new EventHandler() { @Override public void handle(DragEvent t) { if (t.getGestureSource() != targetNode && t.getDragboard().hasImage()) { t.acceptTransferModes(TransferMode.ANY); } t.consume(); } }); targetNode.setOnDragDropped(new EventHandler() { @Override public void handle(DragEvent t) { System.out.println("On drag dropped"); boolean result = false; if (t.getGestureSource() == targetNode) { return; } Clipboard cb = t.getDragboard(); if (cb.hasImage()) { final Image image = cb.getImage(); System.out.println("Dropped image: " + image.toString()); contentPane.getChildren().addAll( ImageViewBuilder.create() .image(image) .id(ID_RECEIVED_IMAGE_2).build()); result = true; } t.setDropCompleted(result); t.consume(); } }); VBox vb = new VBox(getDefaultSpacing()); vb.getChildren().addAll(targetNode, contentPane); HBox root = new HBox(getDefaultSpacing()); root.getChildren().add(vb); targetScene = new Scene(root, getSceneWidth(), getSceneHeight()); stage.setTitle(getTitle()); stage.setScene(targetScene); stage.setX(getSceneWidth() + 50); stage.show(); } private double getSceneWidth() { return 400.0; } private int getSceneHeight() { return 250; } private void compare(Image src, Image dst) { for (int i = 0; i < src.getWidth(); i++) { for (int j = 0; j < src.getHeight(); j++) { Color color1 = src.getPixelReader().getColor(i, j); Color color2 = dst.getPixelReader().getColor(i, j); if (!color1.equals(color2)) { System.out.println("Pixel is different :" + "(" + i + ";" + j + ")"); System.out.println("Expected = " + color1); System.out.println("Actual = " + color2); } } } } private String getTitle() { return System.getProperty("java.runtime.version") + ";" + System.getProperty("javafx.runtime.version"); } private void takeSceneScreenshots() { srcNode.setVisible(false); targetNode.setVisible(false); btnScreenShot.setVisible(false); WritableImage src = srcScene.snapshot(null); saveImg("SrcScene", src); WritableImage target = targetScene.snapshot(null); saveImg("TargetScene", target); compare(src, target); try { Robot rob = new Robot(); Window wnd1 = srcScene.getWindow(); Window wnd2 = targetScene.getWindow(); BufferedImage capture1 = rob.createScreenCapture( new Rectangle((int) wnd1.getX(), (int) wnd1.getY() + 50, (int) wnd1.getWidth(), (int) wnd1.getHeight() - 50)); File f = new File("img/AWT_Src.png"); f.getParentFile().mkdirs(); try { ImageIO.write(capture1, "png", f); } catch (IOException ex) { Logger.getLogger(DndImageTest.class.getName()).log(Level.SEVERE, null, ex); return; } BufferedImage capture2 = rob.createScreenCapture( new Rectangle((int) wnd2.getX(), (int) wnd2.getY() + 50, (int) wnd2.getWidth(), (int) wnd2.getHeight() - 50)); f = new File("img/AWT_Target.png"); try { ImageIO.write(capture2, "png", f); } catch (IOException ex) { Logger.getLogger(DndImageTest.class.getName()).log(Level.SEVERE, null, ex); return; } compare(SwingFXUtils.toFXImage(capture1, null), SwingFXUtils.toFXImage(capture2, null)); } catch (AWTException ex) { Logger.getLogger(DndImageTest.class.getName()).log(Level.SEVERE, null, ex); } srcNode.setVisible(true); targetNode.setVisible(true); btnScreenShot.setVisible(true); } private void saveImg(String name, Image img) { File f = new File("img/" + name + ".png"); f.getParentFile().mkdirs(); try { ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", f); } catch (IOException ex) { Logger.getLogger(DndImageTest.class.getName()).log(Level.SEVERE, null, ex); } } private int getDefaultSpacing() { return 5; } }