从 fx:define 块引用多行字符串变量

Refer to a multiline String variable from fx:define block

我在fx:define中定义了多行字符串变量:

<fx:define>
    <String fx:id="LABEL_01" fx:value="${'liczba czytelników\nzarejestrowanych'}"/>
</fx:define>

现在我想在Label中引用它。如何使用 LABEL_01 作为 text 值来做到这一点?这不起作用:

<Label text="$LABEL_01"/>

想提一下这段代码有效:

<Label text="${'liczba czytelników\nzarejestrowanych'}"/>

Java 代码也可以(为什么不可以?):

Label labelLiczbaCzytelnikowZarejestrowanych = new Label("liczba czytelników\nzarejestrowanych");

但我想用 FXML 来做。

我可以使用 &#xD; 来解决 FXML 中的多行问题。

<fx:define>
    <String fx:id="LABEL_01" fx:value="liczba czytelników&#xD;zarejestrowanych'}"/>
</fx:define>

那我可以用这个代码来参考LABEL_01:

<Label text="$LABEL_01"/>

这是解决方案之一,但我还是想知道如何引用变量"${'liczba czytelników\nzarejestrowanych'}"?

Wish to mention that this piece of code works:

<Label text="${'liczba czytelników\nzarejestrowanych'}"/>

这可能不像您想象的那样有效。

${} 语法是 expression binding。这 绑定 目标 属性 (text) 到 {} 之间的表达式。由于您的表达式是 'string',因此您使用的是 字符串常量 。解析表达式时,它将 \n 解释为换行符。基本上,字符串常量 与 Java 代码中的 字符串文字 相同。

注意:你可以看到 text 属性 是通过将 Label 注入控制器并查询 textProperty().isBound().

一些等效的 Java 代码是:

Label label = new Label();
label.textProperty()
        .bind(Bindings.createStringBinding(() -> "liczba czytelników\nzarejestrowanych"));

<String fx:id="LABEL_01" fx:value="${'liczba czytelników\nzarejestrowanych'}"/>

${} 语法在 fx:value 的上下文中没有特殊含义。它所做的是使用 class' 静态 valueOf(String) 方法创建目标类型 (String)。 valueOf 方法的参数是由 fx:value 属性定义的文字值。这意味着表达式绑定语法和 \n 将按原样使用。 \n 实际上是一个反斜杠后跟一个 "n",与在 Java.

中使用 "\n" 相同

FXML 文件的核心只是一个 XML 文件。据我所知,FXML 格式在表达式绑定中不提供 字符串常量 之外的特殊多行支持。但是,您可以使用 XML 转义符来插入换行符(即 )。