1

我目前正在探索 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);

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

任何帮助是极大的赞赏!

4

1 回答 1

4

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

@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());
}

这只会影响场景,但您可以将其扩展到所有屏幕。

于 2014-11-18T18:02:29.950 回答