このエントリは、JavaFX Advent Calendar 2017 の 16 日目です。昨日は平田あづみ(@planet_az / id:planet-az)でした。明日は@opengl_8080さんです。
JavaFXにはHTMLEditorというそのものずばりなコントロールが付属しています。HTMLの編集と入出力、印刷ができるようです。これがあればホームページビルダーみたいなソフトを簡単に自作できるのでは?ということでちょっと試してみました。
とりあえず作ってみたのがこれです。Scene Builderの最新版にメニュー付き画面のテンプレートが用意されているので、それを使ってみました。
見た目だけなら割と本格派です。実際にワードパット並みの編集機能は持っています。何となくですが使えそうな気にはさせてくれます。
ただ、このHTMLEditorには1つ問題があって、カット・コピー&ペーストやらフォントやら段落書式やら編集操作はいろいろできるのですが、それらをプログラムから制御することができません。例えば、メニューからカット・コピー&ペーストを行おうにも、メニューから呼び出すためのインタフェースがHTMLEditorには備わっていません。
悔しいので深く追っていくと、HTMLEditorは処理のほとんどをHTMLEditorSkinというクラスに委ねていることがわかります。いわゆるhas-Aの関係です。さらにHTMLEditorSkinを見ていくと、内部でWebViewクラスとWebPageクラスを使っていることがわかります。WebPageはWebView内部から呼び出されるクラスで、HTMLEditorSkinからも直接呼び出されます。どうやらHTMLEditorはHTMLの編集にWebViewの内部機能(たぶんWebKit)を用いているようです。HTMLEditorが生成するHTMLはこんな感じになります。
見づらい…でも、自動生成したHTMLにインデントや改行を求めてはいけませんよね…
HTMLEditorの様々なボタンは、HTMLEditorSkinがprivateフィールドで保持しているようです。リフレクションを使ってprivateフィールドに強引にアクセスするのはSIer辞めてPayaraに移った例の人が大好きな手法ですが(あの人確か4~5年くらいリフレクションのユーティリティをスクラップ&ビルドしてたはず)、わたしは今のところやるつもりはないです。
HTMLEditorはJava 9からjavafx.webモジュールに含まれているのですが、なぜjavafx.webに分類されたのか、今回の結果でわかったような気がします。
今回作成した(正確には作成途中というべきか?)アプリケーションは、GitHubにアップロードしています。