JavaFX透明窗口

背景說明

今天在寫自己的桌面小工具時,做了一個後臺運行的週期性任務,想着每次任務完成時在桌面右下角顯示一個文字提示。最終做出來Demo效果如下圖,點擊"顯示提示"按鈕,桌面右下角用綠色透明顯示"顯示提示信息成功!"字樣。

transparent-stage

實現分析

這裏我是新創建了一個Stage,然後將一個Text放到VBox中,進兒放到Stage的Scene中。那麼這裏就有幾個要點:

1) Stage要沒有窗口裝飾

stage.initStyle(StageStyle.TRANSPARENT);

2) Scene要透明

scene.setFill(null);

3) VBox要透明

box.setStyle("-fx-background:transparent;");

4) Text要設置字體和顏色

text.setFont(new Font(20));
text.setFill(Color.GREEN);

5) Stage要居桌面右下角

Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage.setX(primaryScreenBounds.getWidth() - width);
stage.setY(primaryScreenBounds.getHeight() - height);

Demo完整代碼

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 *
 * @author Alan
 */
public class TransparentStage extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("顯示提示");

        btn.setOnAction((ActionEvent event) -> {
            Text text = new Text("顯示提示信息成功!");
            text.setFont(new Font(20));
            text.setFill(Color.GREEN);
            VBox box = new VBox();
            box.getChildren().add(text);
            box.setStyle("-fx-background:transparent;");

            final int width = 200;
            final int height = 50;
            final Scene scene = new Scene(box, width, height);
            scene.setFill(null);

            final Stage stage = new Stage();
            stage.initStyle(StageStyle.TRANSPARENT);
            stage.setScene(scene);
            Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
            stage.setX(primaryScreenBounds.getWidth() - width);
            stage.setY(primaryScreenBounds.getHeight() - height);
            stage.show();

            Task t = new Task() {
                @Override
                protected Object call() throws Exception {
                    Thread.sleep(1000);
                    Platform.runLater(stage::close);
                    return "";
                }
            };
            new Thread(t).start();
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

 http://www.alanzeng.cn/2015/11/javafx-transparent-stage/

發佈了94 篇原創文章 · 獲贊 39 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章