JavaFX: JavaFX8でブラウザ
さくらばさんの
JavaFX でブラウザ - JavaFX in the Box
の記事のコードを、勉強のため、とりあえずJavaFX8で動くところまで修正してみました。
本当はレイアウトはFXMLを使うべきなのだろうけれど、オリジナルのコードとの対比がわかるように(という言い訳で)そこは手を付けていません。
Reflectionの使い方が悪いのか、反射効果が反映されないので、代わりにセピアトーンのエフェクトを追加しています。
import javafx.application.Application; import javafx.concurrent.Worker; import javafx.concurrent.Worker.State; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.effect.Reflection; import javafx.scene.effect.SepiaTone; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.text.Font; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; public class WebViewDemo extends Application { private WebEngine engine; private TextField urlBox; @Override public void start(Stage stage) { stage.setTitle("WebView Demo"); BorderPane borderPane = new BorderPane(); borderPane.setLayoutY(10); borderPane.setLayoutX(10); Scene scene = new Scene(borderPane); stage.setScene(scene); // ブラウザ WebView view = new WebView(); engine = view.getEngine(); view.setPrefSize(600, 500); borderPane.setCenter(view); // 反射効果を加える Reflection reflection = new Reflection(); reflection.setFraction(0.5); view.setEffect(reflection); // 反射効果が反映されないので、代わりにセピアトーン view.setEffect(new SepiaTone()); // ページのロードが終了したときの処理 Worker<Void> worker = engine.getLoadWorker(); worker.stateProperty().addListener((ov, oldState, newState) -> { if (newState == State.SUCCEEDED) { String url = engine.getLocation(); urlBox.setText(url); } }); // 水平ボックス HBox hbox = new HBox(10); hbox.setPrefHeight(40); hbox.setAlignment(Pos.BASELINE_CENTER); borderPane.setTop(hbox); // テキスト入力 urlBox = new TextField(); urlBox.setFont(new Font("sanserif", 16)); hbox.getChildren().add(urlBox); urlBox.setOnAction(event -> loadUrl()); // ボタン Button button = new Button("Open"); button.setFont(new Font("sanserif", 16)); hbox.getChildren().add(button); button.setOnAction(event -> loadUrl()); stage.show(); } // ページのロード private void loadUrl() { String url = urlBox.getText(); if (url != null && !url.trim().isEmpty()) { engine.load(url); } } public static void main(String[] args) { launch(args); } }
こんな感じ