我有一段代碼,設計上採用節點的屏幕截圖的JavaFX:強制UI更新
public BufferedImage getSnapshot(final Node... hideNodes) {
Window window = getScene().getWindow();
Bounds b = localToScene(getBoundsInLocal());
int x = (int) Math.round(window.getX() + getScene().getX() + b.getMinX());
int y = (int) Math.round(window.getY() + getScene().getY() + b.getMinY());
int w = (int) Math.round(b.getWidth());
int h = (int) Math.round(b.getHeight());
try {
Robot robot = new Robot();
for(Node node : hideNodes) {
node.setOpacity(0);
node.getParent().requestLayout();
}
BufferedImage image = robot.createScreenCapture(new java.awt.Rectangle(x, y, w, h));
for(Node node : hideNodes) {
node.setOpacity(1);
node.getParent().requestLayout();
}
return image;
}
catch(AWTException ex) {
return null;
}
}
它的扭轉,那就是它採取的截圖之前應隱藏給出節點(如果它們與節點重疊(在某些情況下,這是明確的)。)
但是,我堅持找到一種方法來強制重繪,在截取屏幕之前包含不透明度更改 - 我發現的唯一參考是requestLayout()
,但那裏沒有快樂。
我應該調用什麼方法強制等待重繪完成?
非常感謝您的全面回答 - 許多古怪的事情可以通過我根本不知道快照方法的事實來解釋,並且認爲使用舊的awt機器人是唯一的選擇。我會很樂意使用這種方法並取消它!然而,BufferedImage是需要的,因爲它提供給需要BufferedImage的庫方法 - 但這是一個足夠簡單的轉換。 – berry120
要將您的JavaFX'Image'轉換爲'BufferedImage',我建議使用[SwingFXUtils.fromFXImage](http://docs.oracle.com/javafx/2/api/javafx/embed/swing/SwingFXUtils.html#fromFXImage %28javafx.scene.image.Image,%20java.awt.image.BufferedImage%29) – jewelsea