请教一下,关于javafx的WebView,

发布于 2021-11-12 11:36:25 字数 1151 浏览 729 评论 3

@tjumyk 你好,想跟你请教个问题:

对于WebView有办法写一个方法可以对于html转成image的吗??

   public void start ( Stage primaryStage )
      {
            final WebView view = new WebView ();

            Scene scene = new Scene ( view , 310 , 310 );
            primaryStage.setScene ( scene );

            final WebEngine webEngine = view.getEngine ();
            webEngine.load ( new File ( "D:/Doc/NetBeansProjects/WebViewBrowser/src/webviewbrowser/newhtml.html" ).toURI ().toString () );

            primaryStage.show ();

            Image image = view.snapshot ( null , null );
            try
            {
                  Thread.sleep ( 500 );
                  ImageIO.write ( SwingFXUtils.fromFXImage ( image , null ) , "png" , new File ( "f:\" + System.currentTimeMillis () + ".png" ) );
            }
            catch ( IOException |
                    InterruptedException ex )
            {
            }
//            System.exit ( 0 );
      }

这个方法我怎么写怎么截图都是空白,先麻烦您了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

偏爱自由 2021-11-16 14:12:49
public class SnapshotTask extends Task<Void> {

	private Node node;
	private long delay;
	private BufferedImage image;

	public SnapshotTask(Node node, long delay) {
		this.node = node;
		this.delay = delay;
	}

	@Override
	protected Void call() throws Exception {
		Thread.sleep(delay);
		Platform.runLater(new Runnable() {
			@Override
			public void run() {
				Image fxImage = node.snapshot(null, null);
				image = SwingFXUtils.fromFXImage(fxImage, null);
			}
		});
		return null;
	}
	
	public BufferedImage getImage(){
		return image;
	}
}
final SnapshotTask task2 = new SnapshotTask(view, 10000);
task2.stateProperty().addListener(new ChangeListener<State>() {
	@Override
	public void changed(ObservableValue<? extends State> observable,
			State oldValue, State newValue) {
		if (newValue == State.SUCCEEDED) {// 此处处理生成的BufferedImage
			JFrame frame = new JFrame("Snapshot");
			frame.add(new JLabel(new ImageIcon(task2.getImage())));// 通过getImage()得到BufferedImage
			frame.pack();
			frame.setVisible(true);
		}
	}
});
new Thread(task2).start();

操作BufferedImage的代码需要写到Listener里面,或在Listener里面调用其他函数。带有延时的snapshot直接作为函数返回不太现实。

并发操作参考:http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

掩饰不了的爱 2021-11-16 13:27:02


@tjumyk ,非常感谢你上面的回答!!!!太有用了,可是还是有个问题,有可能把上面这个功能独立出来做成一个方法,然后return 一个BufferedImage吗??等于html2image直接存到一个文件没啥问题,可是如果让他成为各方法输出.....好像实现不来?

惜醉颜 2021-11-16 12:09:05
public void start(Stage primaryStage) throws Exception {
	final WebView view = new WebView();

	Scene scene = new Scene(view, 310, 310);
	primaryStage.setScene(scene);

	final WebEngine webEngine = view.getEngine();
	webEngine.load(this.getClass().getResource("web/index.html")
			.toExternalForm());

	primaryStage.show();

	// 方式1. 监听webEngine加载进度,可能页面加载不完整
	webEngine.getLoadWorker().stateProperty()
			.addListener(new ChangeListener<State>() {
				@Override
				public void changed(ObservableValue<? extends State> ov,
						State oldState, State newState) {
					if (newState == State.SUCCEEDED) {
						snapshot(view);
					}
				}
			});
	
	// 方式2. 使用Transition设定延时
	PauseTransition ptr = new PauseTransition(Duration.seconds(3));
	ptr.setOnFinished(new EventHandler<ActionEvent>() {
		
		@Override
		public void handle(ActionEvent event) {
			snapshot(view);
		}
	});
	ptr.play();
	
	//方式3. 使用Task设定延时
	Task<String> task = new Task<String>() {

		@Override
		protected String call() throws Exception {
			Thread.sleep(5000);
			return null;
		}
	};
	task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
		
		@Override
		public void handle(WorkerStateEvent event) {
			snapshot(view);
		}
	});
	new Thread(task).start();
	
	// 方式4. 自己实现多线程调用,较麻烦
	new Thread(){
		public void run() {
			try {
				Thread.sleep(7000);//该命令不可直接在Fx用户线程执行,否则会导致前台的渲染线程暂停,页面不会被加载
				Platform.runLater(new Runnable() {
					
					@Override
					public void run() {
						snapshot(view);//在后台线程中不可以直接操作UI,需要借助runLater
					}
				});
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		};
	}.start();
}

public void snapshot(Node view) {
	Image image = view.snapshot(null, null);
	try {
		ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png",
				new File("f:\" + System.currentTimeMillis() + ".png"));
	} catch (IOException e) {
		e.printStackTrace();
	}
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文