I want to create tab preview in tooltip. For this I need to capture tab content before tooltip will be shown to user. For this I use Node.snapshot()
method. The problem is that it doesn’t see changes in content, for example, in ProgressBar
. I tried to use applyCss()
and layout()
methods to redraw the node, but it didn’t help. This is my code:
<code>public class JavaFxTest8 extends Application {
@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
var button1 = new Button("Capture");
var button2 = new Button("Progress");
ImageView tabPreview = new ImageView();
tabPreview.setFitWidth(200);
tabPreview.setPreserveRatio(true);
Tab tab1 = new Tab("Tab 1", new VBox(tabPreview, button1, button2));
var progressBar = new ProgressBar(0.0);
Tab tab2 = new Tab("Tab 2", new VBox(progressBar));
tabPane.getTabs().addAll(tab1, tab2);
button1.setOnAction(e -> {
SnapshotParameters snapshotParams = new SnapshotParameters();
var tab = tabPane.getTabs().get(1);
((VBox) tab.getContent()).applyCss();
((VBox) tab.getContent()).layout();
Image tabImage = tab.getContent().snapshot(snapshotParams, null);
tabPreview.setImage(tabImage);
});
button2.setOnAction(e -> {
progressBar.setProgress(progressBar.getProgress() + 0.1);
});
StackPane root = new StackPane(tabPane);
Scene scene = new Scene(root, 400, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
</code>
<code>public class JavaFxTest8 extends Application {
@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
var button1 = new Button("Capture");
var button2 = new Button("Progress");
ImageView tabPreview = new ImageView();
tabPreview.setFitWidth(200);
tabPreview.setPreserveRatio(true);
Tab tab1 = new Tab("Tab 1", new VBox(tabPreview, button1, button2));
var progressBar = new ProgressBar(0.0);
Tab tab2 = new Tab("Tab 2", new VBox(progressBar));
tabPane.getTabs().addAll(tab1, tab2);
button1.setOnAction(e -> {
SnapshotParameters snapshotParams = new SnapshotParameters();
var tab = tabPane.getTabs().get(1);
((VBox) tab.getContent()).applyCss();
((VBox) tab.getContent()).layout();
Image tabImage = tab.getContent().snapshot(snapshotParams, null);
tabPreview.setImage(tabImage);
});
button2.setOnAction(e -> {
progressBar.setProgress(progressBar.getProgress() + 0.1);
});
StackPane root = new StackPane(tabPane);
Scene scene = new Scene(root, 400, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
</code>
public class JavaFxTest8 extends Application {
@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
var button1 = new Button("Capture");
var button2 = new Button("Progress");
ImageView tabPreview = new ImageView();
tabPreview.setFitWidth(200);
tabPreview.setPreserveRatio(true);
Tab tab1 = new Tab("Tab 1", new VBox(tabPreview, button1, button2));
var progressBar = new ProgressBar(0.0);
Tab tab2 = new Tab("Tab 2", new VBox(progressBar));
tabPane.getTabs().addAll(tab1, tab2);
button1.setOnAction(e -> {
SnapshotParameters snapshotParams = new SnapshotParameters();
var tab = tabPane.getTabs().get(1);
((VBox) tab.getContent()).applyCss();
((VBox) tab.getContent()).layout();
Image tabImage = tab.getContent().snapshot(snapshotParams, null);
tabPreview.setImage(tabImage);
});
button2.setOnAction(e -> {
progressBar.setProgress(progressBar.getProgress() + 0.1);
});
StackPane root = new StackPane(tabPane);
Scene scene = new Scene(root, 400, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
And this is the result:
As you see ProgressBar
value changed, but it is not seen in the image. Could anyone say how to fix it?