2015-10-07 2 views
0

Я создаю приложение javafx, где одна из сцен включает в себя цветные круги и линии. В зависимости от определенного состояния мне нужно изменить цвета. Я хотел сохранить результирующую обновленную сцену как образ для последующего использования. В то время как снятие скриншота является опцией, в некоторых условиях только данные вычисляются в базе данных, и обновленная сцена не отображается на экране.Сохранить fxml-сцену как изображение

Так можно каким-то образом получить результирующее изображение из fxml без отображения на экране?

ответ

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); 
    } 
} 
Смежные вопросы