我有一个带有TabPane的应用程序。我想创建所有选项卡的快照。有人会认为tab.getContent()。snapshot(new SnapshotParameters(),null)会起作用。但是,只有在该选项卡之前处于活动状态时,情况才如此。如果不是,则根据其内容会产生奇怪的影响和遗漏。例如,对于HTMLEditor,我得到了编辑器的基本UI,但没有包含文本。
示例代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;
public class SnapshotTest extends Application {
// Create a tab with an html editor
public Tab createEditorTab(String txt) {
Tab t = new Tab(txt);
HTMLEditor e = new HTMLEditor();
e.setHtmlText(txt);
t.setContent(e);
return t;
}
@Override
public void start(Stage primaryStage) {
TabPane pane = new TabPane();
TabPane imagePane = new TabPane();
Tab snapshotTab = new Tab("Snapshots");
Button b = new Button("Take Snapshots");
b.setOnAction((e)-> {
imagePane.getTabs().clear();
for (int i=1;i<pane.getTabs().size();i++) {
Tab t = pane.getTabs().get(i);
WritableImage imageView = t.getContent().snapshot(new SnapshotParameters(), null);
Tab imageTab = new Tab("Snapshot of "+t.getText());
ImageView v = new ImageView();
v.setImage(imageView);
imageTab.setContent(v);
imagePane.getTabs().add(imageTab);
}
});
VBox box = new VBox();
box.getChildren().addAll(b,imagePane);
snapshotTab.setContent(box);
pane.getTabs().addAll(snapshotTab,
createEditorTab("Tab 1"),
createEditorTab("Tab 2"));
VBox root = new VBox();
root.getChildren().addAll(pane);
root.setMinSize(300, 400);
Scene scene = new Scene(root, 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
当我单击“拍摄快照”时,将获得HTMLEditor的图像,但没有其内容。
仅当我至少激活了他们的标签一次后,内容才会显示出来。
我知道,节点必须先成为场景的一部分,然后才能拍摄快照,但是显然还有很多,如果它们是不活动的选项卡的一部分,则仅当选项卡时,才会发生某些渲染步骤显示。有没有一种方法可以强制执行此操作而无需每个选项卡都处于活动状态?