リンクの処理はHyperlinkListenerで行う
単にWebページを表示するだけならこれで十分ですが、せめてリンクをクリックして移動するぐらいのことはできないとちょっと不便ですね。そこでJEditorPaneにハイパーリンクの機能をつけるには、どうすればいいのでしょう。
これには、まずJEditorPaneのsetEditableをfalseに設定し、編集不可の状態にしておく必要があります。表示をロックすると、JEditorPaneではハイパーリンク部分をクリックした際にjavax.swing.event.HyperlinkEventが発生するようになります。このイベントは、javax.swing.event.HyperlinkListenerというリスナークラスを使って処理することができます。これは、
html.addHyperlinkListener(this);
このようにaddHyperlinkListenerメソッドを使ってJEditorPaneに組み込むことができます。要するHyperlinkListenerには、必ず「hyperlinkUpdate」メソッドを実装しておく必要があります。ここでは、以下のようにしてハイパーリンクをクリックしたときのページ移動を実現しています。
public void hyperlinkUpdate(HyperlinkEvent ev) {
if (ev.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
try {
URL u = ev.getURL();
url.setText(u.toString());
html.setPage(u);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
メソッドで最初にやることは、「発生したイベントの種類を調べる」ことです。HyperlinkEventが発生するのは、リンクをクリックしたときだけではありません。したがって、リンクをクリックしてハイパーリンクのための呼び出しが行われたときにのみページ移動の処理を行うようにしておく必要があります。
ここでは、HyperlinkEventの「getEventType」というものを使ってイベントの種類を調べていますね。イベントの種類は、HyperlinkEvent.EventTypeにクラスフィールドとして用意されています。ACTIVATEDであれば、ハイパーリンクによるページ移動が呼び出されたと判断できるわけです。
種類の特定さえできれば、後は簡単ですね。HyperlinkEventから「getURL」で発生したイベントのURLインスタンスを取得します。これがハイパーリンクの移動先を示すものです。これを元にテキストフィールドに移動先のURLを表示し、JEditorPaneにsetPageすればページ移動が行えるようになります。