2017-02-15 26 views
2

У меня проблема: Я пишу программу, которая похожа на пустую бумагу, на которой вы можете писать (бесплатное ручное письмо), вставлять текст, добавлять изображения, добавлять PDF-файлы и т. Д. ... Для одной конкретной функции мне нужно преобразовать узлы, добавленные пользователем в панель, изображениями. К счастью, JavaFX-узлы обеспечивают хороший метод:Выполнение моментальных снимков JavaFX TextArea и WebView

public void snapshot(...) 

Но есть одна проблема: Когда я пытаюсь сделать снимки текстовых объектов, которые они терпят неудачу. Единственным узлом, который я могу сделать с моментальным снимком, является javafx.scene.text.Text. следующие классы неудачу:

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

Вот пример, чтобы проиллюстрировать мою проблему:

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); 
    } 
} 

я мог думать о работе вокруг, создавая javafx.scene.text.Text-Object и сделайте снимок этого. Но это не удастся для форматированного текста, отображаемого javafx.scene.web.WebView.

Заранее благодарим за вашу помощь!

ответ

1

TextArea должен быть Scene, прежде чем вы снимете его. Добавьте следующую строку кода перед вызовом снимка и код будет работать, как вы ожидаете:

Scene snapshotScene = new Scene(textArea); 

Это требование упоминается в snapshot javadoc:

ПРИМЕЧАНИЕ: Для того, чтобы CSS и расположение к правильно, узел должен быть частью сцены (сцена может быть прикреплена к сцене, но не обязательно ).

+0

Большое вам спасибо! Отличный ответ! – Soir

 Смежные вопросы

  • Нет связанных вопросов^_^