我正在构建一个javafx应用程序,其中一个场景涉及彩色圆圈和线条。根据特定条件,我需要更改颜色。 我想将生成的更新场景保存为图像供以后使用。虽然截取屏幕截图是一种选择,但在某些情况下,只有计算出的数据存储在数据库中,更新的场景不会显示在屏幕上。
那么有可能以某种方式从fxml中获取结果图像而不在屏幕上显示吗?
答案 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);
}
}