2

语句 1 从 css 获取图像文件,即使我提供了绝对 url,也找不到图像文件。为什么?

图像文件位置是正确的,因为在语句 3 中,它有效。这是对jewelsea 发布的解决方案的进一步查询。

import javafx.scene.image.Image;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TextFieldCssSample extends Application {

    @Override
    public void start(Stage stage) {
        TextField textField = new TextField();
        textField.setId("textField");
        StackPane layout = new StackPane();
        layout.getChildren().addAll(textField);
        // 1) following statement **fails**. resources folder is below the root level folder
        textField.setStyle("-fx-border-color: red; -fx-background-image:url('/resources/pumpkin-icon.png'); -fx-background-repeat: no-repeat; -fx-background-position: right center;");
        // 2) following statement succeeds in finding a http url. 
        //    textField.setStyle("-fx-border-color: red; -fx-background-image:url('http://icons.iconarchive.com/icons/rockettheme/halloween/32/pumpkin-icon.png'); -fx-background-repeat: no-repeat; -fx-background-position: right center;");
        // 3) following statement succeeds finding image file. 
        stage.getIcons().add(new Image("/resources/pumpkin-icon.png"));
        stage.setScene(new Scene(layout));
        stage.show();
    }

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

更新:cnahr 的解决方法奏效了!我还打开了 JavaFX 错误报告。RT-31131

4

1 回答 1

2

省略内联 CSS URL 中的前导斜杠。

严重地。我只是做了一点实验,发现只有当完整的URL 被指定为像 (1) 这样的内联 CSS中的相对URL 时,才会加载嵌入在 JAR 中的图像。

但是,当我在 (3) 中使用 Image 构造函数时,我可以省略或包含前导斜杠。无论如何,图像都会很好地加载。

所以我认为您刚刚在 JavaFX CSS 解析器中发现了一个错误。:)


注意:当使用绝对路径时,Java FX2 代码中的 RT-31131 内联 CSS 语句无法找到图像文件已作为 RT-21697 CSS 的副本关闭:没有方案的 url("...") 中的绝对路径应该与 Java 8 版本中已解决的 classpath 相关,因此 CSS 处理错误已在以后的 JavaFX 版本中修复。

于 2013-06-15T05:34:05.943 回答