JavaFX 2.0 WebView / WebEngine将网页呈现给图像

前端之家收集整理的这篇文章主要介绍了JavaFX 2.0 WebView / WebEngine将网页呈现给图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一种加载页面方法,并将渲染保存为图像,就像您使用CutyCapt(QT webkit EXE)做的那样.

在目前和没有JavaFX的时候,我通过调用一个外部进程从java和渲染到文件,而不是将该文件加载到一个ImageBuffer …中既不是非常优化也不实用,甚至更少的跨平台…

使用JavaFX2我试过玩WebView& WebEngine:

  1. public class WebComponentTrial extends Application {
  2. private Scene scene;
  3.  
  4. @Override
  5. public void start(final Stage primaryStage) throws Exception {
  6. primaryStage.setTitle("Web View");
  7. final Browser browser = new Browser();
  8. scene = new Scene(browser,1180,800,Color.web("#666970"));
  9. primaryStage.setScene(scene);
  10. scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
  11. primaryStage.show();
  12. }
  13.  
  14. public static void main(final String[] args) {
  15. launch(args);
  16. }
  17. }
  18. class Browser extends Region {
  19. static { // use system proxy settings when standalone application
  20. // System.setProperty("java.net.useSystemProxies","true");
  21. }
  22.  
  23. final WebView browser = new WebView();
  24. final WebEngine webEngine = browser.getEngine();
  25.  
  26. public Browser() {
  27. getStyleClass().add("browser");
  28. webEngine.load("http://www.google.com/");
  29. getChildren().add(browser);
  30. }
  31.  
  32. @Override
  33. protected void layoutChildren() {
  34. final double w = getWidth();
  35. final double h = getHeight();
  36. layoutInArea(browser,w,h,HPos.CENTER,VPos.CENTER);
  37. }
  38.  
  39. @Override
  40. protected double computePrefWidth(final double height) {
  41. return 800;
  42. }
  43.  
  44. @Override
  45. protected double computePrefHeight(final double width) {
  46. return 600;
  47. }
  48. }

有一个废弃的方法:在Scene中的renderToImage(请参阅下面的链接),这将做一些接近的事情,并且我可以使用它,但它已被弃用…
它在JavaFX中被弃用似乎意味着没有javadoc广告替换方法,因为我无法访问代码,我看不到它是如何完成的…

这里有几个网站,我发现一些信息,但没有什么可以将网页呈现给图像:

  1. http://tornorbye.blogspot.com/2010/02/how-to-render-javafx-node-into-image.html

canvasImage和saveImage(canvasImage,fc.getSelectedFile())从这一个:

  1. http://javafx.com/samples/EffectsPlayground/src/Main.fx.html

其他:

  1. http://download.oracle.com/javafx/2.0/webview/jfxpub-webview.htm
  2. http://download.oracle.com/javafx/2.0/get_started/jfxpub-get_started.htm
  3.  
  4.  
  5. Maps in JavaFX 2.0

解决方法

我通过在Swing JFrame和JFXPanel上启动JavaFX WebView来完成此任务.然后,当WebEngine状态为SUCCEEDED时,我在JFXPanel上使用paint()方法.

您可以按照本教程制作WebView:Integrating JavaFX into Swing Applications

下面的代码演示了如何从JFXPanel捕获渲染的屏幕.

  1. public static void main(String args[]) {
  2. jFrame = new JFrame("Demo Browser");
  3. jfxPanel = new JFXPanel();
  4. jFrame.add(jfxPanel);
  5. jFrame.setVisible(true);
  6. jFrame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  7.  
  8. SwingUtilities.invokeLater(new Runnable() {
  9. @Override
  10. public void run() {
  11. Platform.runLater(new Runnable() {
  12. @Override
  13. public void run() {
  14. browser = new FXBrowser();
  15. jfxPanel.setScene(browser.getScene());
  16. jFrame.setSize((int)browser.getWebView().getWidth(),(int)browser.getWebView().getHeight());
  17.  
  18. browser.getWebEngine().getLoadWorker().stateProperty().addListener(
  19. new ChangeListener() {
  20. @Override
  21. public void changed(ObservableValue observable,Object oldValue,Object newValue) {
  22. State oldState = (State)oldValue;
  23. State newState = (State)newValue;
  24. if (State.SUCCEEDED == newValue) {
  25. captureView();
  26. }
  27. }
  28. });
  29. }
  30. });
  31. }
  32. });}
  33.  
  34.  
  35. private static void captureView() {
  36. BufferedImage bi = new BufferedImage(jfxPanel.getWidth(),jfxPanel.getHeight(),BufferedImage.TYPE_INT_ARGB);
  37. Graphics graphics = bi.createGraphics();
  38. jfxPanel.paint(graphics);
  39. try {
  40. ImageIO.write(bi,"PNG",new File("demo.png"));
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. graphics.dispose();
  45. bi.flush();}

猜你在找的Java相关文章