20 ハイパーリンク
この章では、テキストをハイパーリンクとしてフォーマットするHyperlinkコントロールについて説明します。
HyperlinkクラスはLabeledコントロールの別のタイプを表します。 図20-1では、デフォルトのハイパーリンク実装状態の例を3つ示しています。
ハイパーリンクの作成
例20-1に、ハイパーリンクを作成するコード・フラグメントを示します。
例20-1 標準のハイパーリンク
Hyperlink link = new Hyperlink();
link.setText("http://example.com");
link.setOnAction((ActionEvent e) -> {
System.out.println("This link is clicked");
});
setTextインスタンス・メソッドは、ハイパーリンクのテキスト・キャプションを定義します。 HyperlinkクラスはLabeledクラスの拡張であるため、ハイパーリンク・キャプションに特定のフォントとテキスト塗りつぶしを設定できます。 setOnActionメソッドは、ハイパーリンクがクリックされたときにコールされる特定のアクションを設定します。これはこのメソッドのButtonコントロールでの動作と同様になります。 例20-1では、このアクションは文字列の出力に限定されています。 ただし、アプリケーション内では、より一般的なタスクを実装する必要があります。
ローカル・コンテンツのリンク
図20-2のアプリケーションは、ローカル・ディレクトリのイメージを表示します。
例20-2に示すこのアプリケーションのソース・コードを確認します。
例20-2 ハイパーリンクを使用したイメージの表示
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class HyperlinkSample extends Application {
final static String[] imageFiles = new String[]{
"product.png",
"education.png",
"partners.png",
"support.png"
};
final static String[] captions = new String[]{
"Products",
"Education",
"Partners",
"Support"
};
final ImageView selectedImage = new ImageView();
final ScrollPane list = new ScrollPane();
final Hyperlink[] hpls = new Hyperlink[captions.length];
final Image[] images = new Image[imageFiles.length];
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Hyperlink Sample");
stage.setWidth(300);
stage.setHeight(200);
selectedImage.setLayoutX(100);
selectedImage.setLayoutY(10);
for (int i = 0; i < captions.length; i++) {
final Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]);
final Image image = images[i] = new Image(
getClass().getResourceAsStream(imageFiles[i])
);
hpl.setOnAction((ActionEvent e) -> {
selectedImage.setImage(image);
});
}
final Button button = new Button("Refresh links");
button.setOnAction((ActionEvent e) -> {
for (int i = 0; i < captions.length; i++) {
hpls[i].setVisited(false);
selectedImage.setImage(null);
}
});
VBox vbox = new VBox();
vbox.getChildren().addAll(hpls);
vbox.getChildren().add(button);
vbox.setSpacing(5);
((Group) scene.getRoot()).getChildren().addAll(vbox, selectedImage);
stage.setScene(scene);
stage.show();
}
}
このアプリケーションは、forループ内で4つのHyperlinkオブジェクトを作成します。 それぞれのハイパーリンクにコールされたsetOnActionメソッドが、ユーザーが特定のハイパーリンクをクリックしたときの動作を定義します。 この場合、images配列の対応するイメージがselectedImage変数に設定されます。
ハイパーリンクは、ユーザーがクリックすると訪問済になります。 このリンクは、HyperlinkクラスのsetVisitedメソッドを使用してリフレッシュできます。 例20-3に示すコード・フラグメントにより、このタスクが実行されます。
例20-3 ハイパーリンクのリフレッシュ
final Button button = new Button("Refresh links");
button.setOnAction((ActionEvent e) -> {
for (int i = 0; i < captions.length; i++) {
hpls[i].setVisited(false);
selectedImage.setImage(null);
}
});
図20-3に示すように、「Refresh Links」ボタンをクリックすると、すべてのハイパーリンクが未訪問の状態になります。
HyperlinkクラスはLabeledクラスの拡張であるため、テキスト・キャプションだけでなくイメージも指定できます。 次の項に示すアプリケーションでは、テキスト・キャプションとイメージの両方を使用して、ハイパーリンクを作成し、リモートHTMLページをロードします。
リモート・コンテンツのリンク
アプリケーション・シーンにWebViewブラウザを埋め込むと、JavaFXアプリケーションにHTMLコンテンツを表示できます。 WebViewコンポーネントは基本のWebページ・ブラウズ機能を提供します。 Webページを表示し、リンクのナビゲーションやJavaScriptコマンドの実行など、ユーザーのインタラクションをサポートします。
例20-4に示すアプリケーションのソース・コードを調べます。 テキスト・キャプションとイメージのある4つのハイパーリンクを作成します。 ハイパーリンクをクリックすると、対応する値がURLとして埋込みブラウザに渡されます。
例20-4 リモートWebページのロード
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class HyperlinkWebViewSample extends Application {
final static String[] imageFiles = new String[]{
"product.png",
"education.png",
"partners.png",
"support.png"
};
final static String[] captions = new String[]{
"Products",
"Education",
"Partners",
"Support"
};
final static String[] urls = new String[]{
"http://www.oracle.com/us/products/index.html",
"http://education.oracle.com/",
"http://www.oracle.com/partners/index.html",
"http://www.oracle.com/us/support/index.html"
};
final ImageView selectedImage = new ImageView();
final Hyperlink[] hpls = new Hyperlink[captions.length];
final Image[] images = new Image[imageFiles.length];
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage) {
VBox vbox = new VBox();
Scene scene = new Scene(vbox);
stage.setTitle("Hyperlink Sample");
stage.setWidth(570);
stage.setHeight(550);
selectedImage.setLayoutX(100);
selectedImage.setLayoutY(10);
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
for (int i = 0; i < captions.length; i++) {
final Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]);
final Image image = images[i] =
new Image(getClass().getResourceAsStream(imageFiles[i]));
hpl.setGraphic(new ImageView (image));
hpl.setFont(Font.font("Arial", 14));
final String url = urls[i];
hpl.setOnAction((ActionEvent e) -> {
webEngine.load(url);
});
}
HBox hbox = new HBox();
hbox.setAlignment(Pos.BASELINE_CENTER);
hbox.getChildren().addAll(hpls);
vbox.getChildren().addAll(hbox, browser);
VBox.setVgrow(browser, Priority.ALWAYS);
stage.setScene(scene);
stage.show();
}
}
例20-2に示すものと同様に、forループ内にハイパーリンクが作成されます。 ハイパーリンクの処理セットによって、対応するURLがurls配列から埋込みブラウザのWebEngineオブジェクトに渡されます。
このアプリケーションをコンパイルして実行すると、図20-4に示すウィンドウが表示されます。
関連APIドキュメント





