SWTのBrowserのハイパーリンク処理を制御したい
SwingのJEditorPaneでブラウザを実装する場合は、 addHyperlinkListener()を使うことで、リンクを制御できる。 addHyperlinkListener()メソッドに HyperlinkListenerを追加しておけば ハイパーリンクがクリックされた時点で通知されるので、 通知されたメソッド内で適切に処理してやればよい。
しかし、SWTのorg.eclipse.swt.browser.Browser クラスでは、 このような目的に使えるメソッドは用意されていないようだ。 どうすればいいのか。
結論 addStatusTextListener()を使え
いろいろ試したり調べた結果、Browser.addStatusTextListener() を 使うことで、解決できることが判明した。
通常、単にHTMLドキュメントを閲覧させるだけの目的の場合は、 すべてブラウザにおまかせしておけば良い。 しかし、リンクをクリックした時点で独自のアクションを追加したい場合は、 ブラウザが勝手にページ移動したりしては困る。
そこで、元になるHTMLの a 要素には、
< a href="foo.html">
の代わりに
< a onclick="window.status='foo.html'">
と記述する。
こうしておくこと、実際に該当 a 要素がクリックされたときに、 addStatusTextListner()に追加しておいた、StatusTextListener.changed() メソッドにStatusEventがコールバックされるので、このコールバック されてきた StatusEvent.text を調べると、見事に foo.html が得られる。