Image from clipboard not correctly displayed in JavaFX 8 application

后端 未结 1 1586
一个人的身影
一个人的身影 2021-01-21 09:12

This program shall paste an image from clipboard into an ImageView (on Windows 10). Unfortunately the image is not correctly displayed.

public class PasteImageF         


        
1条回答
  •  温柔的废话
    2021-01-21 09:27

    found this solution by the help of https://community.oracle.com/thread/2238566

        package com.wilutions.jiraddin;
    
        import java.awt.Graphics;
        import java.awt.Toolkit;
        import java.awt.datatransfer.DataFlavor;
        import java.awt.datatransfer.Transferable;
        import java.awt.image.BufferedImage;
        import java.awt.image.RenderedImage;
        import java.io.ByteArrayInputStream;
        import java.io.ByteArrayOutputStream;
    
        import javax.imageio.ImageIO;
    
        import javafx.application.Application;
        import javafx.event.ActionEvent;
        import javafx.event.EventHandler;
        import javafx.scene.Scene;
        import javafx.scene.control.Button;
        import javafx.scene.image.ImageView;
        import javafx.scene.layout.VBox;
        import javafx.stage.Stage;
    
        public class PasteImageFromClipboard extends Application {
    
            ImageView imageView = new ImageView();
            Button bnPaste = new Button("Paste");
    
            public static void main(String[] args) {
                Application.launch(args);
            }
    
            @Override
            public void start(Stage stage) throws Exception {
    
                bnPaste.setOnAction(new EventHandler() {
                    public void handle(ActionEvent event) {
                        try {
                            java.awt.Image image = getImageFromClipboard();
                            if (image != null) {
                                javafx.scene.image.Image fimage = awtImageToFX(image);
                                imageView.setImage(fimage);
                            }
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    
                VBox vbox = new VBox();
                vbox.getChildren().addAll(bnPaste, imageView);
                Scene scene = new Scene(vbox);
                stage.setScene(scene);
                stage.setWidth(400);
                stage.setHeight(400);
                stage.show();
            }
    
            private java.awt.Image getImageFromClipboard() {
                Transferable transferable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
                if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                    try {
                        return (java.awt.Image) transferable.getTransferData(DataFlavor.imageFlavor);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }
    
            private static javafx.scene.image.Image awtImageToFX(java.awt.Image image) throws Exception {
                if (!(image instanceof RenderedImage)) {
                    BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null),
                            BufferedImage.TYPE_INT_ARGB);
                    Graphics g = bufferedImage.createGraphics();
                    g.drawImage(image, 0, 0, null);
                    g.dispose();
    
                    image = bufferedImage;
                }
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ImageIO.write((RenderedImage) image, "png", out);
                out.flush();
                ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
                return new javafx.scene.image.Image(in);
            }
    
        }
    

    0 讨论(0)
提交回复
热议问题