首页 > 解决方案 > 具有多种颜色的 JavaFX 警报

问题描述

我有一个程序在某些时候(可能)显示两个警告 - 一个关于错误 - 那些是红色的,另一个是关于警告的 - 那些是橙色的。

然而,我想知道是否有一种方法 - 使用 css - 只有一个带有红色文本和橙色文本的警告。

这是我想要实现的示例(两者可以分为“部分”):

RED ERROR1
RED ERROR2
RED ERROR3
ORANGE WARNING1
ORANGE WARNING2

我已经看到一些指向RichTextFX 喜欢这个的答案,但是我看不到(或不知道)这如何适用于通用警报。这是否可能,无需编写一些自定义ExpandedAlert类?

标签: cssjavafxalert

解决方案


该类Alert继承自Dialog,它提供了非常丰富的 API,并允许通过该content属性设置任意复杂的场景图。

如果您只想要具有不同颜色的静态文本,最简单的方法可能是添加标签到VBox; 尽管如果需要,您也可以使用更复杂的结构,例如问题中提到TextFlow的第三方。RichTextFX

一个简单的例子是:

import java.util.Random;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class App extends Application {

    private final Random rng = new Random();

    private void showErrorAlert(Stage stage) {
        Alert alert = new Alert(Alert.AlertType.ERROR);
        int numErrors = 2 + rng.nextInt(3);
        int numWarnings = 2 + rng.nextInt(3);
        VBox errorList = new VBox();
        for (int i = 1 ; i <= numErrors ; i++) {
            Label label = new Label("Error "+i);
            label.setStyle("-fx-text-fill: red; ");
            errorList.getChildren().add(label);
        }
        for (int i = 1 ; i <= numWarnings ; i++) {
            Label label = new Label("Warning "+i);
            label.setStyle("-fx-text-fill: orange; ");
            errorList.getChildren().add(label);
        }
        alert.getDialogPane().setContent(errorList);
        alert.initOwner(stage);
        alert.show();
    }
    @Override
    public void start(Stage stage) {
        Button showErrors = new Button("Show Errors");
        showErrors.setOnAction(e -> showErrorAlert(stage));
        BorderPane root = new BorderPane(showErrors);
        Scene scene = new Scene(root, 400, 400);
        stage.setScene(scene);
        stage.show();
    }


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

}

这给出了这个结果:

在此处输入图像描述


推荐阅读