2017-05-23 1 views
0

ich den folgenden Code haben, der gut arbeitet ..Kann ich einen Schnappschuss einer Szene programmgesteuert erfassen?

import javafx.application.Platform; 
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 javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

/* User: [email protected] Date: 2017/05/23 */ 
public class CaptureScene { 

    public static void main(String[] args) throws IOException { 
     JFXPanel jfxPanel = new JFXPanel(); 
     Platform.runLater(() -> { 
      WebView webView = new WebView(); 
      webView.getEngine().load("file:///Users/koraytugay/Desktop/sample.html"); 
      jfxPanel.setScene(new Scene(webView)); 

      final JFrame jFrame = new JFrame(); 
      jFrame.setLayout(new FlowLayout()); 
      jFrame.getContentPane().add(jfxPanel); 

      final JButton saveAsImage = new JButton("Save as Image"); 
      jFrame.getContentPane().add(saveAsImage); 
      saveAsImage.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 
          final Scene scene = jfxPanel.getScene(); 
          WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 
          BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
          try { 
           ImageIO.write(bufferedImage, "png", new File("/Users/koraytugay/Desktop/vaaappp.png")); 
          } catch (IOException va) { 
           va.printStackTrace(); 
          } 
         } 
        }); 
       } 
      }); 

      jFrame.setSize(1920, 1080); 
      jFrame.setVisible(true); 
      jFrame.requestFocus(); 
     }); 
    } 
} 

so, wenn ich diese Anwendung ausführen, wird sample.html fein gemacht werden, und wenn ich auf der JFrame den Knopf drücken, wird es als Bild gespeichert werden Alles gut.

aber ich will nicht stören den Knopf schlagen, und das ist, was ich versuche ..

import javafx.application.Platform; 
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 javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

/* User: [email protected] Date: 2017/05/23 */ 
public class CaptureScene { 

    public static void main(String[] args) throws IOException { 
     JFXPanel jfxPanel = new JFXPanel(); 
     Platform.runLater(() -> { 
      WebView webView = new WebView(); 
      webView.getEngine().load("file:///Users/koraytugay/Desktop/sample.html"); 
      jfxPanel.setScene(new Scene(webView)); 

      final JFrame jFrame = new JFrame(); 
      jFrame.setLayout(new FlowLayout()); 
      jFrame.getContentPane().add(jfxPanel); 


      jFrame.setSize(1920, 1080); 
      jFrame.setVisible(true); 
      jFrame.requestFocus(); 


      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        final Scene scene = jfxPanel.getScene(); 
        WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 
        BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
        try { 
         ImageIO.write(bufferedImage, "png", new File("/Users/koraytugay/Desktop/baanb.png")); 
        } catch (IOException va) { 
         va.printStackTrace(); 
        } 
       } 
      }); 

     }); 
    } 
} 

Aber das gespeicherte Bild ist nur ein leeres weißes Bild. Was vermisse ich? Im Grunde versuche ich eine HTML-Seite als PNG zu speichern, gehe ich einen falschen Ansatz? Sollte ich das auf eine andere Weise tun? Eigentlich wird dies auf der Serverseite laufen, also wird JFrame überhaupt nicht funktionieren?

Antwort

2

Fügen Sie einen geeigneten Listener zu hinzu, der von WebEngine gehalten wird, der Ihre WebView lädt. Wenn der Status des Mitarbeiters SUCCEEDED ist, planen Sie den Snapshot. Ausgehend von diesem example ergibt ein snapshot() des Feldes webView das gezeigte Ergebnis.

image

WebEngine webEngine = webView.getEngine(); 
Worker worker = webEngine.getLoadWorker(); 
worker.stateProperty().addListener((Observable o) -> { 
    if (worker.getState() == Worker.State.SUCCEEDED) { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       WritableImage image = webView.snapshot(
        new SnapshotParameters(), new WritableImage(800, 400)); 
       BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
       try { 
        ImageIO.write(bufferedImage, "png", new File("image.png")); 
       } catch (IOException va) { 
        va.printStackTrace(); 
       } 
      } 
     }); 
    } 
}); 
Verwandte Themen