Action Buttons css style in JavaFX ControlFX dialog

后端 未结 3 814
你的背包
你的背包 2020-12-19 20:14

I\'ve been using ControlsFX dialogs to show information, but the style of my application is not blue, and does not match dialog style (color, borders) is there a way to cha

3条回答
  •  遥遥无期
    2020-12-19 21:09

    Since you don't provide the version you are using, I'll go with the new OpenJFX-Dialogs project (source, started since 8.20.7 version), which are by the way the same dialogs we'll have with JDK8u40.

    Firts, let's add some alert dialog:

    @Override
    public void start(Stage primaryStage) {
        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setTitle("Confirmation Dialog");
        alert.setHeaderText("This is a Regular Confirmation Dialog");
        alert.setContentText("This is the message");
    
        Button button = new Button("Click to display an alert");
        button.setOnAction(e->{
            Optional result = alert.showAndWait();
            result.ifPresent(System.out::println);
        });
    
        Scene scene = new Scene(new StackPane(button), 300, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    Regular Alert Dialog

    Now, to style this dialog, we need an instance of DialogPane, which is the root node within a dialog, where the header, the content and the buttons are displayed.

    Via lookups or via getChildren() it's easy to find these components.

    This is an example of customizing all of the components of the dialog:

    @Override
    public void start(Stage primaryStage) {
        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setTitle("Confirmation Dialog");
        alert.setHeaderText("This is a Custom Confirmation Dialog");
        alert.setContentText("We override the style classes of dialog.css");
    
        Button button = new Button("Click to display an alert");
        button.setOnAction(e->{
            Optional result = alert.showAndWait();
            result.ifPresent(System.out::println);
        });
    
        Scene scene = new Scene(new StackPane(button), 300, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    
        DialogPane dialogPane = alert.getDialogPane();
    // root
        dialogPane.setStyle("-fx-background-color: greenyellow;");
    
    // 1. Grid
        // remove style to customize header
        dialogPane.getStyleClass().remove("alert");
    
        GridPane grid = (GridPane)dialogPane.lookup(".header-panel"); 
        grid.setStyle("-fx-background-color: cadetblue; "
                + "-fx-font-style: italic;");
    
        // custom icon
        StackPane stackPane = new StackPane(new ImageView(
                new Image(getClass().getResourceAsStream("lock24.png"))));
        stackPane.setPrefSize(24, 24);
        stackPane.setAlignment(Pos.CENTER);
        dialogPane.setGraphic(stackPane);
    
    // 2. ContentText with just a Label
        dialogPane.lookup(".content.label").setStyle("-fx-font-size: 16px; "
                + "-fx-font-weight: bold; -fx-fill: blue;");
    
    // 3- ButtonBar
        ButtonBar buttonBar = (ButtonBar)alert.getDialogPane().lookup(".button-bar");
        buttonBar.setStyle("-fx-font-size: 24px;"
                + "-fx-background-color: indianred;");
        buttonBar.getButtons().forEach(b->b.setStyle("-fx-font-family: \"Andalus\";"));
    
    }
    

    And this is how it looks like:

    Custom Alert Dialog

提交回复
热议问题