【问题标题】:Handling CSS errors in Javafx处理 Javafx 中的 CSS 错误
【发布时间】:2017-07-22 14:48:47
【问题描述】:

我正在编写一个 JavaFX 程序,其中用户输入颜色的十六进制值并将其设置为 StakePane 的背景颜色。代码是:

stakePane.styleProperty().setValue("-fx-background-color: "+inputValue+";");

它适用于有效的十六进制值输入。但是当用户输入无效的十六进制值时,它会在控制台上给出以下错误:

javafx.scene.CssStyleHelper 计算值

警告:从 ComboBox@20f56ee2[styleClass=combo-box-base combo-box] 上的内联样式解析“-fx-background-color”查找时无法解析“#E91E63g”

我尝试try catch 来处理这个错误。但是错误没有被捕获。

JavaFX CSS Reference Guide 说:

“需要从解析器中检测错误的应用程序可以在 com.sun.javafx.css.StyleManager 的 errors 属性中添加一个监听器。”

如何处理 javafx 中的 CSS 错误?

【问题讨论】:

  • 你能分享你的try-catch吗?

标签: java css javafx


【解决方案1】:

这样的错误不会引发真正的 java 异常。相反,负责将 CSS 应用到场景的全局 StyleManager 只会打印警告。
但很高兴StyleManager 拥有一个包含所有发生错误的可观察列表。如参考指南所述,您可以简单地添加一个监听器。您会收到通知,并且可以相应地处理错误。

com.sun.javafx.css.StyleManager.errorsProperty().addListener((ListChangeListener<? super CssError>) c -> {
        while(c.next()) {
            for(CssError error : c.getAddedSubList()) {
                // maybe you want to check for specific errors here
                System.out.println(error.getMessage());
            }
        }
    });

但我认为在您的情况下,最好在将输入字符串应用于 CSS 之前检查输入字符串的格式是否有效;)

【讨论】:

    【解决方案2】:

    您可以在将颜色应用到堆栈窗格之前简单地验证颜色。如果颜色不是有效颜色,则设置默认颜色。

    下面是一个将十六进制颜色值应用于堆栈窗格的简单示例。颜色值存储在组合框中。现在,在将背景颜色设置为 stackpane 之前,我调用了一个方法 getColorValue(String colorValue)。现在,如果颜色是有效颜色,那么我设置颜色,否则我打印一条消息并设置默认颜色。以下示例中的默认颜色为红色 (#F00000)。

    为了验证颜色,我使用了正则表达式。

      private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
    

    正则表达式很简单。它查找由 [A-Fa-f0-9]{6} 表示的 6 个字母值或由 [A-Fa-f0-9]{3} 表示的 3 个字母值。颜色值必须以“#”符号开头。

     public class ColorApp extends Application {
    
    
        String backGroundColor = "";
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            Label messageLabel = new Label("Color NOT SELECTED FROM COMBOBOX");
    
            ObservableList<String> options =
                    FXCollections.observableArrayList(
                            "DEFG",
                            "#ZZZAAA",
                            "#ABCDEF",
                            "#055"
                    );
    
            StackPane stackPane = new StackPane();
    
            final ComboBox comboBox = new ComboBox(options);
            comboBox.setItems(options);
            stackPane.getChildren().addAll(messageLabel,comboBox);
            StackPane.setAlignment(messageLabel,Pos.TOP_LEFT);
    
            comboBox.valueProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue observable, String oldValue, String newValue) {
                    backGroundColor = newValue;
                    stackPane.styleProperty().setValue("-fx-background-color: " + (backGroundColor = ColorUtils.getColorValue(backGroundColor)) + ";");
                    messageLabel.setText(backGroundColor + " Applied");
    
                }
            });
    
    
            Scene scene = new Scene(stackPane,600,800);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    
    class ColorUtils {
    
        private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
        static Pattern pattern = Pattern.compile(HEX_PATTERN);
        static Matcher matcher;
        private static final String DEFAULT_COLOR_VALUE = "#F00000";
    
        public static String getColorValue(String colorValue) {
            matcher = pattern.matcher(colorValue);
            boolean result = matcher.matches();
            if (result == false) {
                System.out.println("Invalid colorValue detected, colorValue==" + colorValue);
                System.out.println("Setting default Color Value to RED");
                return DEFAULT_COLOR_VALUE;
            } else {
                return colorValue;
            }
        }
    }
    

    如果从组合框中选择的颜色得到验证,将显示以下输出。 颜色验证:

    颜色未验证:

    编辑:请注意,我正在使用堆栈窗格并手动将位置设置为标签。不建议这样做。仅用于演示目的。

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2016-03-02
      • 2016-08-18
      • 2012-11-23
      相关资源
      最近更新 更多