LoginSignup
9
12

More than 5 years have passed since last update.

JavaFx WebViewでサイトのスクリーンショットを撮ってすぐ終わる

Last updated at Posted at 2016-02-09

はじめに

事前に準備する外部ライブラリ等はありません。

実装例

サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

WebViewTest.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.image.WritableImage;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

/**
 *
 * @author tool-taro.com
 */
public class WebViewTest extends Application {

    public static void main(String[] args) {
        WebViewTest.launch(args);
    }

    @Override
    public void start(Stage stage) throws IOException {
        //スクリーンショットを撮るサイト
        String url = "http://tool-taro.com/";
        //画像ファイルの保存先
        String filePath = "webview.png";

        WebView webView = new WebView();
        webView.setPrefSize(1440, 900);

        WebEngine webEngine = webView.getEngine();
        webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
            @Override
            public void changed(ObservableValue ov, State oldState, State newState) {
                //changeイベントが完了した時点でスクリーンショットを撮る
                if (newState == Worker.State.SUCCEEDED) {
                    stage.setTitle(webEngine.getLocation());

                    WritableImage image = webView.snapshot(null, null);
                    BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
                    try {
                        ImageIO.write(bufferedImage, "png", new File(filePath));
                    }
                    catch (IOException e) {
                        e.printStackTrace();
                    }
                    finally {
                        //アプリケーションを終了する
                        Platform.exit();
                    }
                }
            }
        });

        //サイトにアクセスしてコンテンツをロードする
        webEngine.load(url);
        //WebViewをSceneに入れてStageにのせて表示する(そうしないとWebEngineのchangeイベントは成功しない)
        stage.setScene(new Scene(webView));
        stage.show();
    }
}

動作確認

$ javac WebViewTest.java
$ java WebViewTest

撮影された画像ファイルです。
webview.png

環境

  • 開発

    • Windows 10 Pro
    • JDK 1.8.0_112
    • NetBeans IDE 8.2
  • 動作検証

    • Windows 10 Pro
    • JDK 1.8.0_112

Webツールも公開しています。
Web便利ツール@ツールタロウ

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12