2016-04-08 3 views
0

Я хочу сделать снимок сайта без какого-либо видео, так что это просто текст с некоторыми css и изображениями.Завершить JFXPanel для изображения

Я использую WebView (который является сцена JFXPanel), чтобы загрузить веб-сайт, а затем сохранить его с помощью

WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
ImageIO.write(bufferedImage, "png", file); 

(где «сцена» является сцена JFXPanel)

но сохраненное изображение просто отображает часть веб-сайта, а не полный контент (см. рисунок).

enter image description here

Как обеспечить/исполнение, что размеры изображения соответствуют размерам содержания JFXPanel и Everthing видно?

Полный код:

package renderer; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Worker; 
import javafx.embed.swing.JFXPanel; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.Scene; 
import javafx.scene.image.WritableImage; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.List; 

public class HtmlRenderer extends Application { 
    private JFXPanel jfxPanel; 
    private WebView webView; 

    public void start(Stage stage) { 
     jfxPanel = new JFXPanel(); 
     webView = new WebView(); 

     webView.getEngine().getLoadWorker().stateProperty().addListener(
       new ChangeListener<Worker.State>() { 
        @Override 
        public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { 
         if (newState == Worker.State.SUCCEEDED) { 
          HtmlRenderer.this.toImage(jfxPanel.getScene()); 
          try { 
           Platform.exit(); 
           HtmlRenderer.this.stop(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 

     jfxPanel.setScene(new Scene(webView)); 

     this.updateView("http://www.stackoverflow.com/"); 
    } 

    private void toImage(Scene scene) { 
     WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 

     // TODO: save in matching dir using proper filename 
     File file = new File("D:/workspace/SiteChecker/test.png"); 

     try { 
      BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
      ImageIO.write(bufferedImage, "png", file); 
     } catch (IOException e) { 
      // TODO: exception handling 
     } 
    } 

    public void updateView(String url) { 
     webView.getEngine().load(url); 
    } 

    private void reloadView() { 
     webView.getEngine().reload(); 
    } 

} 
+0

Вышеуказанный код точно так же - представляет собой пустую белую страницу на Java 8 (как для OpenJDK, так и для Oracle). –

+0

@ DarrellTeague вы видели принятый ответ? Я также работал с Java 8, но только с Oracle. – Jonas

ответ

0

Таким образом, я нашел решение, но это далеко от совершенства, и на самом деле не perfomant. Однако для меня ничего не работает. Фокус в том, чтобы загрузить сайт один раз, определить ширину и высоту сайта. Во второй раз я устанавливаю предпочтительный размер Webview для определенных значений и снова загружаю веб-сайт с новым размером. Я думаю, это потому, что в первый раз визуализируется только видимая часть.

Ширина и высота может быть определена с JavaScript, например .:

private int getPageWidth(WebView webView) { 
    String script = "Math.max(" + 
      "document.body.scrollWidth, document.body.offsetWidth," + 
      "document.documentElement.clientWidth, document.documentElement.scrollWidth," + 
      "document.documentElement.offsetWidth);"; 

    WebEngine engine = webView.getEngine(); 

    int maxWidth = (int) engine.executeScript(script); 
    return maxWidth; 
} 

почему некоторые сайты имеют забавный конец/низ, т.е. есть много пустого пространства.

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