如何在javafx中制作透明的场景和舞台?

Posted

技术标签:

【中文标题】如何在javafx中制作透明的场景和舞台?【英文标题】:how to make transparent scene and stage in javafx? 【发布时间】:2016-03-06 03:01:55 【问题描述】:

我想要透明的进度指示器,它是不确定的。

这里是代码,它显示灰色背景状态/场景。 我想要完全透明。

我尝试了以下代码,但它显示的背景舞台不透明。

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

    public class Main extends Application 

        @Override
        public void start(Stage stage) 
            /*
             * 
             * my css file content:
             * 
             * .progress-indicator .indicator  -fx-background-color: transparent;
             * -fx-background-insets: 0; -fx-background-radius: 0;
             * 
             *  .progress-indicator  -fx-progress-color: green ; 
             * 
             * 
             * 
             */
            Stage initStage = new Stage();

            initStage.initStyle(StageStyle.TRANSPARENT);
            ProgressIndicator loadProgress = new ProgressIndicator();
            loadProgress.setSkin(null);
            loadProgress.setPrefWidth(50);
            VBox box = new VBox();
            box.getChildren().add(loadProgress);
            final Scene scene = new Scene(box, 150, 150);

            scene.setFill(Color.TRANSPARENT);

            initStage.setScene(scene);
            scene.getStylesheets().add("application.css");

            initStage.show();

        

        public static void main(String[] args) 
            launch(args);
        

    

【问题讨论】:

相关:javafx transparent window background with decorations. 【参考方案1】:

对于modena.css(Java 8 中的默认 JavaFX 外观定义),为所有控件引入了轻微的阴影背景(如果加载了控件,还引入了窗格)。

您可以通过指定默认背景为透明来删除它。这可以通过将以下行添加到应用程序的 CSS 文件来完成:

.root  -fx-background-color: transparent; 

这是您在代码中已有的用于初始化舞台样式和场景背景填充的其他设置的补充。

stage.initStyle(StageStyle.TRANSPARENT);
scene.setFill(Color.TRANSPARENT);

注意:在问题的示例代码中,创建了一个附加阶段 (initStage),而不是使用传入的阶段作为启动方法。传入的阶段可以由您的代码直接初始化、使用和显示,而不是创建额外的 initStage。

【讨论】:

Tutorials on JavaFX 不擅长提及此类内容。感觉他们的代码有 50% 的时间都失败了,因为这样的“惊喜”:-(。花了 2 个小时在这上面,直到我放弃了,找到了你的解决方案。谢谢伙计!【参考方案2】:
stage.initStyle(StageStyle.TRANSPARENT);

这是为了隐藏顶部栏(最小化、还原和关闭)

scene.setFill(Color.TRANSPARENT);

这是框架颜色(你可以用任何颜色 GREEN YELLOW RED BLUE 替换 TRANSPARENT ...)但对我来说,如果你能理解我,我想要玻璃视图,并且使用不同的颜色,所以解决方案是

primaryStage.setOpacity(0.2);

数字 0.2 在 0 和 1 之间。0 是隐藏的,1 是正常形式,但在数字之间是透明的,所以选择你的数字并运行你的程序,看看这是否是你想要的,这个代码是全屏的。

primaryStage.setFullScreen(true);

并在 css 文件中执行此操作

.root  -fx-background-color:rgba(0,0,0,1); 

您可以通过更改rgba(0,0,0,1)中的数字来更改颜色

【讨论】:

【参考方案3】:

这对我有用。

Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
Scene scene = new Scene(root);
scene.setFill(Color.TRANSPARENT);
stage.setScene(scene);
stage.initStyle(StageStyle.TRANSPARENT);
stage.show();

你只需要主要两件事:

scene.setFill(Color.TRANSPARENT);
stage.initStyle(StageStyle.TRANSPARENT);

【讨论】:

在 JavaFX 10 上它对我不起作用,scene.setFill 需要 Paint 而不是 int @GuillaumeF。 Color 派生自 Paint(它是一个子类)。而Color.TRANSPARENTColor(这是Paint)而不是int。所以设置填充为透明色就OK了。除非场景中涉及Control,否则此解决方案应该可以正常工作,在这种情况下,还需要其他答案中讨论的其他 CSS 设置。

以上是关于如何在javafx中制作透明的场景和舞台?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javafx中定位窗口舞台?

如何在 JavaFX 的控制器文件中调用舞台上的函数

如何使 JavaFX 窗格适应其内容的大小?

JavaFX 8:舞台插图(窗户装饰厚度)?

为啥禁用舞台可调整大小在 javafx 中不起作用?

JavaFX如何改变阶段