HyperlinkListenerの実装
リンクにマウスポインタを移動すると指のcursorに変わる。クリックすればリンク先に移動する。 |
JEditorPaneに表示されたドキュメント内のリンクを利用するためには、2つの処理が必要となります。1つは、JEditorPaneを「編集不可」にする、という作業です。これは、以下のようにして行っていますね。
doc_pane.setEditable(false);
これで編集不可の状態にできました。編集不可にしておかないと、この後に説明するイベントが発生しないのです。このため、これは下準備として必ず行う必要があります。
もう1つは、リンクをマウスで操作する際に発生するイベントの処理を実装する、というものです。リンクをマウスで操作した際には「HyperlinkEvent」というイベントが発生します。これは、「HyperlinkListener」というイベントリスナーをimplementsして実装します。このイベントはAWTにはなく、Swingから新たに用意されたものであるため、javax.swing.eventパッケージに必要なクラスやインターフェイスが用意されています。
クラスの定義を見てみると、「implements ActionListener,HyperlinkListener」というようにHyperlinkListenerをimplementsしていることがわかりますね。そして、JEditorPaneインスタンスを作成するところで、
doc_pane.addHyperlinkListener(this);
このようにして、HyperlinkListenerをJEditorPaneに組み込んでいます。これで、リンクを操作するとイベントが発生し、このイベントリスナーで処理されるようになります。
リンクを操作した際に発生するイベントは、HyperlinkListenerの「hyperlinkUpdate」というメソッドによって処理されます。これは以下のように定義されます。
public void hyperlinkUpdate(HyperlinkEvent e) {
……イベント処理……
}
引数に渡されるHyperlinkEventインスタンスには、発生したイベントに関する情報がまとめられています。ここから、イベントの種類、リンク先のURLといった情報をえることができます。
このイベント処理でもっとも注意しなければならないのは「リンクをクリックしたとき以外にもイベントは発生する」という点でしょう。このイベントは、マウスポインタをリンク上に移動しただけで発生します。ですから、イベントの種類を調べ、リンクをクリックしたときに移動するように処理を行う必要があります。
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){...
ここでは、HyperlinkEventインスタンスの「getEventType」というものを呼び出しています。これは発生したイベントの種類を示すもので、HyperlinkEvent.EventTypeクラスのクラスフィールドとして値が用意されています。
マウスでリンクをクリックしたときのイベントは、HyperlinkEvent.EventType.ACTIVATEDとなります。従って、getEventTypeがこの値であったときだけ処理を行うようにすればよいわけですね。
URL url = e.getURL();
url_field.setText(url.toString());
doc_pane.setPage(url);
クリックしたリンクのURLは、HyperlinkEventの「getURL」で得ることができます。このURLをそのままsetPageすれば、JEditorPaneの表次ページがリンク先のURLに変更できるというわけです。
リンク関係のイベントは、イベントの種類による操作さえしっかり理解できれば、それほど複雑ではありません。リンクは、いろいろな応用が考えられます。「Webページの表示」ということだけでなく、ちょっとしたリンクをJEditorPaneで用意しておけるだけでも、ずいぶんと面白いことができますね。