将fxml场景另存为图像

时间:2015-10-07 16:12:01

标签: java javafx fxml

我正在构建一个javafx应用程序,其中一个场景涉及彩色圆圈和线条。根据特定条件,我需要更改颜色。 我想将生成的更新场景保存为图像供以后使用。虽然截取屏幕截图是一种选择,但在某些情况下,只有计算出的数据存储在数据库中,更新的场景不会显示在屏幕上。

那么有可能以某种方式从fxml中获取结果图像而不在屏幕上显示吗?

1 个答案:

答案 0 :(得分:3)

是的:你可以做到

Image fxmlImage = new Scene(FXMLLoader.load(getClass().getResource("/path/to/fxml")))
    .snapshot(null);

请注意,如果在FXML中指定,控制器类必须位于类路径上才能使用。

这是一个SSCCE(运行时请记住以上警告):

import java.io.File;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;


public class FXMLViewer extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button loadButton = new Button("Load");
        FileChooser fileChooser = new FileChooser();
        fileChooser.getExtensionFilters().add(new ExtensionFilter("FXML files", "*.fxml"));
        loadButton.setOnAction(e -> {
            File file = fileChooser.showOpenDialog(primaryStage);
            if (file != null) {
                try {
                    Image image = new Scene(FXMLLoader.load(file.toURI().toURL())).snapshot(null);
                    showImage(image, primaryStage);
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        });
        StackPane root = new StackPane(loadButton);
        Scene scene = new Scene(root, 350, 120);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void showImage(Image image, Stage owner) {
        double width = Math.max(400, image.getWidth());
        double height = Math.max(400, image.getHeight());
        ScrollPane root = new ScrollPane(new ImageView(image));
        Scene scene = new Scene(root, width, height);
        Stage stage = new Stage();
        stage.initOwner(owner);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}