如何制作带圆角或阴影的舞台?

时间:2016-05-30 19:12:11

标签: javafx

我刚刚学习JavaFX,而且我发现几年前,有些人学会了如何使用这些样式制作好的(模态)阶段。
JavaFX模态确认对话框示例:https://gist.github.com/jewelsea/1887631/155d5e052b6ec7d0eaa6f825713f98f8e542152e 我重新创建了这个,但是有些代码已被弃用(构建器)。

所以我想问一下,如果我可以使用当前支持的API创建一个具有圆角(或不是),甚至是阴影的舞台弹出窗口?我的应用程序需要很多弹出阶段,所以我想建立一个很好的风格。

1 个答案:

答案 0 :(得分:1)

我会在这里发布答案给那些偶然发现旧例子的人,使用示例中的CSS。我在Java中将场景填充设置为透明,而不是通过CSS(我不知道该怎么做,但这很好)。

       // initialize the stage
    primaryStage.setTitle("Modal Confirm Example");
    final WebView webView = new WebView(); webView.getEngine().load("http://docs.oracle.com/javafx/");
    primaryStage.setScene(new Scene(webView));
    primaryStage.show();

    // initialize the confirmation dialog
    final Stage util = new Stage(StageStyle.TRANSPARENT);
    util.initModality(Modality.APPLICATION_MODAL);
    util.initOwner(primaryStage);

    HBox hbox = new HBox();
    Pane pane = new Pane(hbox);
    Scene scene = new Scene(pane);
    Label label = new Label("Will you like this page?");
    Button yesButton = new Button("Yes");
    Button noButton = new Button("No");
    hbox.getChildren().addAll(label, yesButton, noButton);

    yesButton.setOnAction(ae -> {
        System.out.println("Liked: " + webView.getEngine().getTitle());
        primaryStage.getScene().getRoot().setEffect(null);
        util.close();
    });
    noButton.setOnAction(ae -> {
        System.out.println("Disliked: " + webView.getEngine().getTitle());
        primaryStage.getScene().getRoot().setEffect(null);
        util.close();
    });

    scene.setFill(Color.TRANSPARENT);
    scene.getStylesheets().add(Machine.class.getResource("modal-dialog.css").toExternalForm());
    pane.getStyleClass().add("modal-dialog-glass");
    hbox.getStyleClass().add("modal-dialog-content");

    util.setScene(scene);

    // show the confirmation dialog each time a new page is loaded.
    webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
      @Override public void changed(ObservableValue<? extends Worker.State> observableValue, Worker.State state, Worker.State newState) {
        if (newState.equals(Worker.State.SUCCEEDED)) {
          primaryStage.getScene().getRoot().setEffect(new BoxBlur());
          util.show();
          util.toFront();
        }
      }
    });     

这是来自问题中链接的示例...(加上一个非功能的根类)。

.root {
    -fx-background-color: transparent;
}

.modal-dialog-glass {
  -fx-effect: dropshadow(three-pass-box, derive(cadetblue, -20%), 10, 0, 4, 4); 
  -fx-background-color: derive(cadetblue, -20%); 
  -fx-background-insets: 12; 
  -fx-background-radius: 6;
}

.modal-dialog-content {
  -fx-padding: 20;
  -fx-spacing: 10;
  -fx-alignment: center;
  -fx-font-size: 20;
  -fx-background-color: linear-gradient(to bottom, derive(cadetblue, 20%), cadetblue);
  -fx-border-color: derive(cadetblue, -20%);
  -fx-border-width: 5;
  -fx-background-insets: 12;
  -fx-border-insets: 10;
  -fx-border-radius: 6;
  -fx-background-radius: 6;
}