2017-02-15 8 views
2

Ich habe das folgende Problem: Ich schreibe ein Programm, das wie ein leeres Papier ist, wo Sie schreiben können (freie Handschrift), Text einfügen, Bilder hinzufügen, PDFs hinzufügen usw ... Für eine bestimmte Funktion muss ich die Knoten, die der Benutzer dem Bild hinzugefügt hat, in Bilder konvertieren. Zum Glück bietet JavaFX-Knoten eine schöne Methode:Schnappschüsse von JavaFX TextArea und WebView machen

public void snapshot(...) 

Aber es gibt ein Problem: Wenn ich versuche, Snapshots von Text-Objekten, die sie scheitern zu lassen. Der einzige Knoten, von dem ich Snapshots machen kann, ist javafx.scene.text.Text. Die folgenden Klassen fehlschlagen:

javafx.scene.control.TextArea 
javafx.scene.web.WebView 

Hier ist ein Beispiel, mein Problem zu veranschaulichen:

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.SnapshotParameters; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     try { 

      TextArea textArea = new TextArea("Lorem Ipsum is simply dummy text" 
        + " of the printing and typesetting industry. Lorem Ipsum has been \n" 
        + "the industry's standard dummy text ever since the 1500s, when an \n" 
        + "unknown printer took a galley of type and scrambled it to make a type\n" 
        + " specimen book. It has survived not only five centuries, but also the\n" 
        + " leap into electronic typesetting, remaining essentially unchanged. It\n" 
        + " was popularised in the 1960s with the release of Letraset sheets containing\n" 
        + " Lorem Ipsum passages, and more recently with desktop publishing software \n" 
        + "like Aldus PageMaker including versions of Lorem Ipsum"); 

      SnapshotParameters snapshotParameters = new SnapshotParameters(); 
      snapshotParameters.setFill(Color.TRANSPARENT); 

      Image img = textArea.snapshot(snapshotParameters, null); 
      ImageView imgVw = new ImageView(img); 

      System.out.printf("img.width: %s height: %s%n", img.getWidth(), img.getHeight()); // <= width and height of the image img is 1:1! WHY? 

      Pane pane = new Pane(); 
      pane.getChildren().addAll(imgVw); 

      Scene scene = new Scene(pane, 800,800); 

      pane.setMinWidth(800); 
      pane.setMinHeight(800); 
      pane.setMaxWidth(800); 
      pane.setMaxHeight(800); 

      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 



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

ich eine einfiel Behelfslösung durch ein javafx.scene.text.Text-Objekt erstellen und mach einen Schnappschuss davon. Aber das wird für formatierten Text fehlschlagen, der von javafx.scene.web.WebView angezeigt wird.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

1

Die TextArea Bedürfnisse ein Scene sein, bevor Sie es Schnappschuss. Fügen Sie die folgende Zeile in Ihrem Code vor dem Snapshot-Aufruf und der Code wird wie erwartet:

Scene snapshotScene = new Scene(textArea); 

Diese Anforderung im snapshot javadoc erwähnt wird:

HINWEIS: Um für CSS und Layout Funktion korrekt, muss der Knoten Teil einer Szene sein (die Szene kann auf eine Bühne angebracht werden, muss aber nicht sein).

+0

Vielen Dank! Perfekte Antwort! – Soir