【问题标题】:JavaFX: Apply background effect when dialog is openJavaFX:打开对话框时应用背景效果
【发布时间】:2014-11-18 14:20:02
【问题描述】:

我目前正在探索 Java JDK 8u40 的新功能,我必须说我真的很喜欢内置的对话框类。与 ControlsFX 相比,对话框打开时没有背景效果(ControlsFX 使背景显得更暗)。我也想用 JavaFX 中的新对话框类来做到这一点。我正在使用以下代码:

TextInputDialog dialog = new TextInputDialog();
dialog.initOwner(null);
dialog.initStyle(StageStyle.UNDECORATED);
dialog.setHeaderText(“Please fill in a new number“);
dialog.setContentText(“New number:”);

//Check if the optional is filled in
Optional<String> newAmount = dialog.showAndWait();
if (result.isPresent()){
    System.out.println(“New number: " + result.get());
}

我在对话框类中找不到任何有用的部分。我试过这段代码,但它有点hacky,而且有点慢:

myMainFlowPane.setOpacity(0.5);
// ..... dialog code ..... //
myMainFlowPane.setOpacity(1.0);

你应该说必须有一个内置的方法。有谁知道怎么做?

非常感谢任何帮助!

【问题讨论】:

    标签: dialog javafx javafx-8 controlsfx


    【解决方案1】:

    您可以轻松实现相同的效果。要在场景和对话框之间添加这个不透明层,只需在场景顶部添加一个不可见区域,并在显示对话框之前以一定的透明度使其可见,在关闭后再次隐藏它。

    @Override
    public void start(Stage primaryStage) {
    
        final Region opaqueLayer = new Region();
        opaqueLayer.setStyle("-fx-background-color: #00000044;");
        opaqueLayer.setVisible(false);
    
        Button btn = new Button("Show Dialog");
        btn.setOnAction(t -> {
            TextInputDialog dialog = new TextInputDialog();
            dialog.initOwner(null);
            dialog.initStyle(StageStyle.UNDECORATED);
            dialog.setHeaderText("Please fill in a new number");
            dialog.setContentText("New number:");
    
            opaqueLayer.setVisible(true);
            //Check if the optional is filled in
            Optional<String> result = dialog.showAndWait();
            opaqueLayer.setVisible(false);
            if (result.isPresent()){
                System.out.println("New number: " + result.get());
            }
        });
    
        StackPane root = new StackPane(btn,opaqueLayer);        
        Scene scene = new Scene(root, 800, 600);
    
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    
        opaqueLayer.resizeRelocate(0, 0, scene.getWidth(), scene.getHeight());
    }
    

    这只会影响场景,但你可以让它扩展到整个屏幕。

    【讨论】:

    • 我再次检查了这个答案,它正在工作。但是,它仍然有点慢。比我希望的要慢..
    • 对我来说效果很好。如果它很慢,那么在图层中并行添加一些淡入/淡出效果怎么样?
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2015-12-14
    • 2020-02-15
    • 2013-04-25
    • 2023-02-16
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多