我有以下代码可以正常工作..
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();
});
}
}
所以当我运行这个应用程序时,sample.html 会被很好地呈现,当我点击 jframe 上的按钮时,它会被保存为一个图像就好了。
但是,我不想打扰按下按钮,这就是我正在尝试的..
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();
}
}
});
});
}
}
但保存的图像只是一个空白的白色图像。我错过了什么?基本上,我试图将 html 页面另存为 png,我采取了错误的方法吗?我应该用其他方式做到这一点吗?实际上,这将在服务器端运行,所以 JFrame 可能根本不起作用?
添加合适的监听器stateProperty
由持有WebEngine
加载你的WebView
。当工作人员的状态为 时SUCCEEDED
,安排快照。从这个例子开始,snapshot()
字段的 awebView
产生显示的结果。
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();
}
}
});
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句