[JavaFX]タイトルバー無しのウィンドウ

java

タイトルバーの無いウィンドウを表示するサンプルです。
Stagesample.javaを編集します。
Stageに装飾なし「StageStyle.UNDECORATED」か透明「StageStyle.TRANSPARENT」の設定をしてあげるとタイトルバーのウインドウができるということで。
stage.initStyle(StageStyle.UNDECORATED);
または、
stage.initStyle(StageStyle.TRANSPARENT);
を指定します。
ソースでは、「StageStyle.TRANSPARENT」を指定しています。
これは、ウィンドウを影付きなものにしたいということで、まずはStageを透明にしてます。
ただこれだけでは透明にならないので・・・
stage.getScene().setFill(null);
を追加します。これでもまだ透明になりません。
ということでScene Builder でfxmlファイルを開きAnchorPaneにスタイル「-fx-background-color」に「transparent」を指定します。

ここでようやく画面自体が透明になりました。
ウインドウに影を付けるため、今度は、AnchorPaneのEffectに「DropShadow」を指定します。

offsetXとoffsetYをそれぞれ5.0にしておくとなんとなく影がついたように見えるかなと。
この状態だとボタンだけが表示されるだけなので、台紙的なものを貼り付けておきます。
先ほどのfxmlファイルをScene Builder で開き、ShapesからRectangleをボタンが見えるようにして貼り付けます。
色は、白を指定しています。

大きさは、AnchorPaneの大きさと合わせてください。

stage.setWidth(400);
stage.setHeight(300);
動かしてみると、出ました。

「閉じる」ボタンがクリックされた時、アプリが終わるように、StagesampleController.javaのhandleButtonActionに
Platform.exit();
を追加しておきます。
各ソースを以下に示します。
Stagesample.java

/**
 * タイトルバーのないウィンドウのサンプル
 */
package stagesample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 *
 */
public class Stagesample extends Application {
  
  @Override
  public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("stagesample.fxml"));
    
    Scene scene = new Scene(root);
    
    stage.setScene(scene);
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.getScene().setFill(null);
    stage.setWidth(400);
    stage.setHeight(300);
    stage.show();
  }

  /**
   */
  public static void main(String[] args) {
    launch(args);
  }
  
}

StagesampleController.java

/**
 * タイトルバーの無いウィンドウサンプル コントローラー
 */
package stagesample;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

/**
 *
 */
public class StagesampleController implements Initializable {
  
  
  /**
   * 閉じるボタン
   */
  @FXML
  private void handleButtonAction(ActionEvent event) {
    Platform.exit(); // 終了
  }
  
  @Override
  public void initialize(URL url, ResourceBundle rb) {
    // TODO
  }  
  
}

stagesample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" style="-fx-background-color: transparent;" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="stagesample.StagesampleController">
  <children>
      <Rectangle arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="200.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" width="320.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0" />
    <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="閉じる" />
  </children>
   <effect>
      <DropShadow offsetX="5.0" offsetY="5.0" />
   </effect>
</AnchorPane>

コメント