このトピックでは、すべての実行環境で動作するJavaおよびJavaFXアプリケーションの開発およびデプロイメントのプログラミングに関するヒントを提供します。
このトピックの内容は次のとおりです。
アプリケーションがブラウザで実行されている場合、アプリケーションは、事前定義済のディメンションを使用してステージングされ、直接更新することはできません。例18-1は、JavaFXアプリケーションがWebページに埋め込まれている場合に検出する単純なコードを示しています。このコードは、メイン・アプリケーションまたはJavaFXプリローダー起動メソッドのいずれかで使用できます。
例18-1 JavaFXアプリケーションがWebページに埋め込まれている場合の検出
public void start(Stage stage) { boolean isEmbedded = (stage.getWidth() > 0); ... }
かわりに、Application.getHostServices()
メソッドからWebコンテキストへの参照の取得を試行できます。アプリケーションが埋め込まれていない場合、Nullが返されます。
JavaFXアプリケーションは、次の様々な方法で渡すことができる名前付きパラメータと名前なしパラメータの両方をサポートしています。
スタンドアロン起動用のコマンド行で指定。
アプリケーション・パッケージでハードコード化(JARおよびデプロイメント記述子)。
アプリケーションが埋め込まれるHTMLページから受渡し。
JavaFXアプリケーションでは、getParameters()
メソッドを使用してプリローダーまたはメイン・アプリケーションからパラメータにアクセスします。たとえば、例18-2のコードでは、すべての名前付きパラメータおよびその値のリストを取得します。
例18-2 名前付きデプロイメント・パラメータおよび値のリストの取得
Map m = getParameters().getNamed(); String labelText = "List of application parameters: \n"; for(String st: (Set<String>) m.keySet()) { labelText += " ["+st+"] : ["+m.get(st)+"]\n"; }
Javaアプレットの場合、アプリケーション・パラメータへのアクセスの詳細は、Javaチュートリアルのアプレット・パラメータの定義および使用に関するトピックを参照してください。
JavaFXアプリケーションでは、Application.getHostServices()
メソッドによって、次のような実行モード固有のサービスにアクセスできます。
コード・ベースおよびドキュメント・ベースに関する情報へのアクセス。
たとえば、埋込みアプリケーションの場合、これは、それぞれアプリケーションのURLとホストWebページのURLになります。
埋込みアプリケーションにのみ使用可能なJavaScriptエンジンを使用した、ホストWebページへのアクセス。
ブラウザでWebページを開く機能。
例18-3は、getHostServices()
を使用して行うことができることをいくつか示しています。
例18-3 getHostServices()の使用
final HostServices services = getHostServices(); Button jsButton = new Button("Test Javascript"); jsButton.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { JSObject js = services.getWebContext(); js.eval("window.alert('Hello from JavaFX')"); } }); Button openButton = new Button("Test openDocument()"); openButton.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent t) { services.showDocument("http://javafx.com/"); } });
File
APIおよび外部データ・ファイルまたはリソースへの明示的な相対参照を使用すると、アプリケーションがWebからロードされるときに動作しない可能性があります。
アプリケーションに相対的なリソースを参照するには、例18-4
に示すように、アプリケーション・クラスの1つでgetResource()メソッドを使用します。
例18-4 getResource()メソッドを使用したリソースのロード
scene.getStylesheets(). add(this.getClass().getResource("my.css").toExternalForm());
かわりに、HostServices
クラスからgetCodeBase()
または
getDocumentBase()を使用して、アプリケーションに相対的なリソースやアプリケーションが使用される場所を参照することを検討します。
JavaFXアプリケーションがWebページに埋め込まれると、アプリケーションはステージ・ディメンションを制御できません。パッケージ化の際に指定されたディメンションはプリファレンスのみで、たとえばユーザーにカスタムのブラウザ・ズーム設定がある場合、ユーザーによってオーバーライドできます。また、ステージはユーザーによっていつでもサイズ変更できます。
適切なユーザー操作性を提供するために、任意のステージ・サイズに備えます。そうしないと、アプリケーションがクロップされるか、ステージの未使用の領域でガベージがペイントされることがあります。
アプリケーションでレイアウトが使用されている場合、何もする必要はありません。レイアウトはサイズ変更を処理します。それ以外の場合、例18-5の簡略化されたコードに示すように、サイズ変更ロジックを実装し、ステージ・ディメンションの変更をリスニングして、アプリケーションを更新します。
例18-5 リスナーを使用した埋込みアプリケーションのサイズ変更
public class ResizeFriendlyApp extends Application implements ChangeListener<Number> { private Stage stage; public void start(Stage stage) { //be resize friendly this.stage = stage; stage.widthProperty().addListener(this); stage.heightProperty().addListener(this); ... //resize content resize(stage.getWidth(), stage.getHeight()); stage.show(); } private void resize(double width, double height) { //relayout the application to match given size } public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) { resize(stage.getWidth(), stage.getHeight()); } }