Copying the image of a ScatterChart to system clipboard in JavaFX 2.0

后端 未结 2 1122
感情败类
感情败类 2021-01-20 03:22

I need to copy a ScatterChart in JavaFX 2.0 to the system clipboard. I\'m not really sure how to copy the whole image of the ScatterChart with the potted points.

相关标签:
2条回答
  • 2021-01-20 03:58

    Gets rid of the need for any bots to take screenshots

    /**
     * Sets the image content of the clipboard to the chart supplied
     * @param chart chart you wish to copy to the clipboard
     */
    public void copyChartToClipboard(ScatterChart<Double, Double> chart) {
        WritableImage image = chart.snapshot(new SnapshotParameters(), null);
        ClipboardContent cc = new ClipboardContent();
        cc.putImage(image);
        Clipboard.getSystemClipboard().setContent(cc);
    }
    
    0 讨论(0)
  • 2021-01-20 03:59

    See next piece of code. I've added full package names for all non-javafx classes to avoid imports mess.

    public void start(final Stage primaryStage) throws Exception {
        VBox root = new VBox();
        final Scene scene;
        primaryStage.setScene(scene = new Scene(root));
        NumberAxis xAxis = new NumberAxis("X-Axis", 0d, 8.0d, 1.0d);
        NumberAxis yAxis = new NumberAxis("Y-Axis", 0.0d, 5.0d, 1.0d);
        ObservableList<XYChart.Series> data = FXCollections.observableArrayList(
                new ScatterChart.Series("Series 1", FXCollections.<ScatterChart.Data>observableArrayList(
                new XYChart.Data(0.2, 3.5),
                new XYChart.Data(0.7, 4.6),
                new XYChart.Data(7.8, 4.0))));
        final ScatterChart chart = new ScatterChart(xAxis, yAxis, data);
    
        Button btnShoot = new Button("screenshot");
        btnShoot.setOnAction(new EventHandler<ActionEvent>() {
    
            public void handle(ActionEvent t) {
                try {
                    // getting screen coordinates
                    Bounds b = chart.getBoundsInParent();
                    int x = (int)Math.round(primaryStage.getX() + scene.getX() + b.getMinX());
                    int y = (int)Math.round(primaryStage.getY() + scene.getY() + b.getMinY());
                    int w = (int)Math.round(b.getWidth());
                    int h = (int)Math.round(b.getHeight());
                    // using ATW robot to get image
                    java.awt.Robot robot = new java.awt.Robot();
                    java.awt.image.BufferedImage bi = robot.createScreenCapture(new java.awt.Rectangle(x, y, w, h));
                    // convert BufferedImage to javafx.scene.image.Image
                    java.io.ByteArrayOutputStream stream = new java.io.ByteArrayOutputStream();
                    ImageIO.write(bi, "png", stream);
                    Image image = new Image(new java.io.ByteArrayInputStream(stream.toByteArray()), w, h, true, true);
                    // put it to clipboard
                    ClipboardContent cc = new ClipboardContent();
                    cc.putImage(image);
                    Clipboard.getSystemClipboard().setContent(cc);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
    
            }
        });
        root.getChildren().addAll(chart, btnShoot);
        primaryStage.show();
    }
    

    N.B.: this approach involves using AWT side-by-side with JavaFX which is generally not a good idea and may not work on all configuration. It's better to use GlassRobot instead of AWTRobot. Unfortunately it's not stable enough yet.

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