2011-12-13 73 views

回答

4

參見下一段代碼。我爲所有非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。不幸的是它還不夠穩定。

3

擺脫的需要任何機器人採取的截圖

/** 
* 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); 
}