Swing/LoadsSynchronously のバックアップの現在との差分(No.4)
- category: swing folder: LoadsSynchronously title: JEditorPaneに読み込んだHTMLを画像に変換する tags: [JEditorPane, HTMLEditorKit, HTML, ImageIO, Graphics] author: aterai pubdate: 2014-12-01T00:02:34+09:00 description: JEditorPaneに画像付きのHTMLを読み込み、描画が完了した段階で全体のスクリーンショットを撮る方法をテストします。 image:
概要
概要
JEditorPane
に画像付きのHTML
を読み込み、描画が完了した段階で全体のスクリーンショットを撮る方法をテストします。
Screenshot
Advertisement
サンプルコード
サンプルコード
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;
//}
#spanadd
#spanend
// @Override public Document createDefaultDocument() {
// Document doc = super.createDefaultDocument ();
// ((HTMLDocument) doc).setAsynchronousLoadPriority(-1);
// return doc;
// }
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、タブを切り替えた後にJEditorPane#setText(...)
でHTML
の読み込みを行い、全体のスクリーンショットを縮小して画像にし、サムネイルとして右端のJLabel
に表示しています。
解説
上記のサンプルでは、タブを切り替えた後にJEditorPane#setText(...)
でHTML
の読み込みを行い、全体のスクリーンショットを縮小してサムネイル画像を作成し右端のJLabel
に表示しています。
- 左:
default
-
default
タブ- デフォルトの
HTMLEditorKit
を使用 -
<img>
の画像が非同期で読み込まれるため、スクリーンショットは文字のみ - 文書の末尾までスクロールした後で、画像のサイズが決まる
- デフォルトの
- 中:
<img width='%d' ...
-
<img>
タグの画像が非同期で読み込まれるためスクリーンショットは文字のみ表示される - 文書の末尾までスクロールした後で画像のサイズが決まる
-
-
<img width='%d' ...
タブ- デフォルトの
HTMLEditorKit
を使用 -
<img>
に予めサイズを属性で指定しているので、スクリーンショット全体のサイズや、スクロールは正常だが、スクリーンショットに画像は表示されない
- デフォルトの
- 右:
LoadsSynchronously
-
HTMLEditorKit#getViewFactory()
、ViewFactory#create(Element)
をオーバーライドし、ImageView
に、setLoadsSynchronously(true)
を設定して、画像の読み込みを同期的に行うように変更 -
<img>
タグに予めサイズを属性で指定しているのでスクリーンショット全体のサイズや、スクロールは正常だがスクリーンショットに画像は表示されない
-
-
LoadsSynchronously
タブ-
HTMLEditorKit#getViewFactory()
とViewFactory#create(Element)
をオーバーライドし、ImageView
にsetLoadsSynchronously(true)
を設定することで画像の読み込みを同期的に行う - スクリーンショットに画像がすべてロードされた状態で表示される
-
参考リンク
- ImageView#setLoadsSynchronously(boolean) (Java Platform SE 8)
- -
-
JDK 11.0.2
、JDK 8.0.202
からImageView
にsetLoadsSynchronously(true)
を設定すると画像が表示されなくなってしまった-
JDK 8.0.222
では修正されている - [JDK-8223384] ImageView incorrectly calculates size when synchronously loaded - Java Bug System
-
OracleJDK
でもOpenJDK
でも同じ状況
-
-
JDK 11.0.1
では正常に画像が表示されるopenjdk version "11.0.1" 2018-10-16 OpenJDK Runtime Environment 18.9 (build 11.0.1+13) OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
参考リンク
- ImageView#setLoadsSynchronously(boolean) (Java Platform SE 8)
- setAsynchronousLoadPriority on JTextPane does not seem to work in 1.6 | Oracle Community