【问题标题】:Image from clipboard not correctly displayed in JavaFX 8 application剪贴板中的图像未正确显示在 JavaFX 8 应用程序中
【发布时间】:2016-04-11 02:27:58
【问题描述】:

此程序应将剪贴板中的图像粘贴到 ImageView(在 Windows 10 上)。不幸的是,图像没有正确显示。

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<ActionEvent>() {
        public void handle(ActionEvent event) {
            Clipboard cb = Clipboard.getSystemClipboard();
            if (cb.hasImage()) {
                Image image = cb.getImage();
                imageView.setImage(image);
            }
        }
    });

    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();
}
}

重现步骤:

  • 启动 cmd.exe
  • 按 ALT-Print 将 cmd 窗口复制到剪贴板
  • 启动程序 PasteImageFromClipboard
  • 在 PasteImageFromClipboard 中按“粘贴”按钮

这个结果显示在我的电脑上:

应该是这样的:

是否需要更多代码才能正确绘制图像?

【问题讨论】:

  • 您能否验证剪贴板中的图像是否“正确”(比如将其粘贴到另一个应用程序中)?看起来黑色窗口背景显示为透明。
  • Windows Paint 和 MS Word 正确显示粘贴的图像。该示例在其他装有 Windows 7 Java8u65 和 2012 Java 8u66 的计算机上正常工作。
  • 有什么更新吗? Win 10 上的 java 8u101 并且此问题仍然存在
  • 我怀疑这个错误修复可能已经解决了这个问题:bugs.java.com/view_bug.do?bug_id=8187928 我会再次尝试使用 Java 1.8.0_172,当该版本可供一般下载时。我认为该修复程序也将在 Java 9 的下一个版本中发布,尽管错误页面目前没有提及它。
  • 我也遇到了同样的问题,图片全被洗掉了。我正在使用 Java 1.8.0_202

标签: javafx-8


【解决方案1】:

在以下的帮助下找到了这个解决方案 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<ActionEvent>() {
                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);
        }

    }

【讨论】:

  • 如果我运行这段代码,它就可以工作。如果我将它集成到我的 JavaFX 应用程序中,我会得到一个java.awt.HeadlessException。当我设置java.awt.headless=fase 时它可以工作,但这个例子也没有。知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多