torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFXでカレンダー表示プログラムを作る(DatePickerのポップアップ利用)(続々)

JavaFXでカレンダー表示プログラムを作る(DatePickerのポップアップ利用)(続) - torutkのブログ の続きです。

ウィンドウ枠とタイトルバーを取っ払います。これでガジェット風になります。ウィンドウ枠とタイトルバーがないと、Windowsの標準操作による表示位置の移動、ウィンドウサイズの変更、終了などができなくなってしまいます。そこで、表示位置と大きさはコマンドラインオプションから指定することとします。

ウィンドウ枠とタイトルバーの取り払い方

        primaryStage.initStyle(StageStyle.TRANSPARENT);
||

** JavaFXでのコマンドラインオプションの取り方

Javaでは、mainメソッドの引数String[]にコマンドラインオプションが入ります。JavaFXプログラムでもこの方法でコマンドラインオプションを取ることができますが、JavaFXでは別途コマンドラインオプションの取得方法が用意されています。

javafx.application.Application.Parametersクラス(Applicationクラスのネストクラス)が提供されており、これを利用して、--name=value 形式のコマンドラインオプションを取り扱います。簡単な説明を次のWikiに記載していますのでよろしければ参照ください。

- [http://www.torutk.com/projects/swe/wiki/JavaFX%E3%81%A8%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%96%E5%BE%97:title]

今回は、次のコマンドラインオプションを指定することとします。

- 表示位置としてカレンダー表示ウィンドウの左上隅のX座標とY座標
- 表示サイズとしてカレンダー表示ウィンドウの幅と高さ 

|* 設定する項目 |* 名前 |* 指定例|
|表示位置のX座標| x     | --x=800 |
|表示位置のY座標| y     | --y=60  |
|表示幅         | width | --width=320 |
|表示高さ       | height| --height=300 |
  
Applicationクラスのインスタンスメソッド内で、次の呼び出しをすることで、--name=value形式で指定したオプションのnameをキーに、valueを値とするMapインスタンスが得られます。

>|java|
Map<String, String> params = getParameters().getNamed();

Application拡張クラス(Calendar.java)に、インスタンスメソッドparseParametersメソッドを設け、その中でオプションを取り出し必要な設定をすることとします。
表示位置・大きさは、stageに対して設定するので、stageをフィールドに持たせておきます。

public class Calendar extends Application {
    private Stage stage;
      :
    public void start(Stage primaryStage) {
        stage = primaryStage; 
          :
    }
}

続いて、コマンドラインオプションを解析し、その値をstageに反映します。

public class Calendar extends Application {
      :
    @Override
    public void start(Stage primaryStage) {
        stage = primaryStage; 
        parseParameters();
          :
     }

    private void parseParameters() {
        Map<String, String> params = getParameters().getNamed();
        Platform.runLater(() -> {
            stage.setX(Double.valueOf(params.getOrDefault("x", "0.0")));
            stage.setY(Double.valueOf(params.getOrDefault("y", "0.0")));
            stage.setWidth(Double.valueOf(params.getOrDefault("width", "144")));
            stage.setHeight(Double.valueOf(params.getOrDefault("height", "144")));
        });
    }
}

ここまでを反映したプログラムは次にあります。

https://github.com/torutk/calendar/tree/v0.1.2