Copy a ScatterChart image to the system clipboard in JavaFX 2.0

I need to copy ScatterChart in JavaFX 2.0 to the system clipboard. I'm not quite sure how to copy the entire ScatterChart image with pots.

+3
source share
2 answers

See the following code snippet. I have added full package names for all classes other than javafx to avoid import clutter.

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

NB: this approach involves using AWT side by side with JavaFX, which is usually not a good idea and may not work in all configurations. It is better to use GlassRobot instead of AWTRobot . Unfortunately, while it is not stable enough.

+4
source

Eliminates 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); } 
+3
source

All Articles