Копирование изображения ScatterChart в системный буфер обмена в JavaFX 2.0 - PullRequest
3 голосов
/ 14 декабря 2011

Мне нужно скопировать ScatterChart из JavaFX 2.0 в системный буфер обмена. Я не совсем уверен, как скопировать все изображение ScatterChart с точками в горшке.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2016

избавляет от необходимости ботов делать скриншоты

/**
 * 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);
}
4 голосов
/ 18 декабря 2011

Смотрите следующий кусок кода. Я добавил полные имена пакетов для всех не-javafx классов, чтобы избежать путаницы при импорте.

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 .: этот подход предполагает использование AWT бок о бок с JavaFX, что, как правило, не очень хорошая идея и может работать не во всех конфигурациях. Лучше использовать GlassRobot вместо AWTRobot. К сожалению, он еще недостаточно стабилен.

...