• title: JEditorPaneに読み込んだHTMLを画像に変換する tags: [JEditorPane, HTMLEditorKit, HTML, ImageIO, Graphics] author: aterai pubdate: 2014-12-01T00:02:34+09:00 description: JEditorPaneに画像付きのHTMLを読み込み、描画が完了した段階で全体のスクリーンショットを撮る方法をテストします。

概要

JEditorPaneに画像付きのHTMLを読み込み、描画が完了した段階で全体のスクリーンショットを撮る方法をテストします。

サンプルコード

class ImageLoadSynchronouslyHTMLEditorKit extends HTMLEditorKit {
  @Override public ViewFactory getViewFactory() {
    return new HTMLEditorKit.HTMLFactory() {
      @Override public View create(Element elem) {
        View view = super.create(elem);
        if (view instanceof ImageView) {
          ((ImageView) view).setLoadsSynchronously(true);
        }
        return view;
      }
    };
  }
  //@Override public Document createDefaultDocument() {
  //  Document doc = super.createDefaultDocument ();
  //  ((HTMLDocument) doc).setAsynchronousLoadPriority(-1);
  //  return doc;
  //}
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、タブを切り替えた後にJEditorPane#setText(...)HTMLの読み込みを行い、全体のスクリーンショットを縮小して画像にし、サムネイルとして右端のJLabelに表示しています。

  • 左: default
    • デフォルトのHTMLEditorKitを使用
    • <img>の画像が非同期で読み込まれるため、スクリーンショットは文字のみ
    • 文書の末尾までスクロールした後で、画像のサイズが決まる
  • 中: <img width='%d' ...
    • デフォルトのHTMLEditorKitを使用
    • <img>に予めサイズを属性で指定しているので、スクリーンショット全体のサイズや、スクロールは正常だが、スクリーンショットに画像は表示されない
  • 右: LoadsSynchronously
    • HTMLEditorKit#getViewFactory()ViewFactory#create(Element)をオーバーライドし、ImageViewに、setLoadsSynchronously(true)を設定して、画像の読み込みを同期的に行うように変更

参考リンク

コメント