Hatena::ブログ(Diary)

tomoTakaの日記

2012-11-17

WebView表示

Web画面のテストをJavaFXでできるようなのでまず始めにid:skrbさんの JavaFX でブラウザ - JavaFX in the Box写経してみました。
環境は、Mac OS X 10.7.4、NetBeans7.2、JavaSE1.7.0_07です。

写経したコードですが、バージョンアップに変更があったので以下の3点を変えています。
1.TextBoxがUI Controlからなくなっていたので変わりにTextFieldを使用
2.WebEngineはWebViewからgetEngineメソッドで取得
3.ページのロード終了時のTaskがWorkerに変わって、イベントも変更
3番目の変更は、JavaFX 2.2を参考にしました。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
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.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;

/**
 * JavaFX
 */
public class WebViewDemo extends Application {
    private WebEngine engine;
    private TextField urlField; // 1.TextBox

    @Override
    public void start(Stage stage) {
        stage.setTitle("WebView Demo");
        BorderPane borderPane = new BorderPane();
        borderPane.setLayoutX(10);
        borderPane.setLayoutY(10);
        Scene scene = new Scene(borderPane);
        stage.setScene(scene);
        // ブラウザ
        WebView view = new WebView();
        engine = view.getEngine(); // 2.WebViewからWebEngineを取得
        view.setPrefSize(600, 500);
        borderPane.setCenter(view);
        // 反射効果を加える
        Reflection reflection = new Reflection();
        reflection.setFraction(0.5);
        view.setEffect(reflection);
        // ページのロードが終了した時の処理
        Worker<Void> worker = engine.getLoadWorker(); //3.TaskからWorker
        worker.stateProperty().addListener(new ChangeListener<State>() {
            @Override
            public void changed(ObservableValue ov, State oldState, State newState) {
                if (newState == State.SUCCEEDED) {
                    String url = engine.getLocation();
                    urlField.setText(url);
                }
            }
        });
        // 水平ボックス
        HBox hbox = new HBox(10);
        hbox.setPrefHeight(40);
        hbox.setAlignment(Pos.BASELINE_CENTER);
        borderPane.setTop(hbox);
        // テキスト入力
        urlField = new TextField();
        hbox.getChildren().add(urlField);
        // ボタン
        Button button = new Button("Open");
        button.setFont(new Font("sanserif", 16));
        hbox.getChildren().add(button);
        button.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent event) {
                loadUrl();
            }
        }
        );
        stage.show();
    }

    // ページのロード
    private void loadUrl() {
        String url = urlField.getText();
        if (url != null && !url.trim().isEmpty()) {
            engine.load(url);
        }
    }

    /**
     * The main() method is ignored in correctly deployed JavaFX application.
     * main() serves only as fallback in case the application can not be
     * launched through deployment artifacts, e.g., in IDEs with limited FX
     * support. NetBeans ignores main().
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

で実行した画面ですが、反射の効果が、、、なぜがうまくいかないです。
f:id:tomoTaka:20121117100753p:image

まだまだ超初心者ですが、少しずつ勉強していこうと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tomoTaka/20121117/1353114625
リンク元