从fx:define块引用多行String变量

时间:2019-01-15 08:53:21

标签: java javafx fxml

我在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做到。

2 个答案:

答案 0 :(得分:3)

  

希望提及这段代码:

<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的上下文中没有特殊含义。这样做是使用类的静态String方法创建目标类型(valueOf(String))。 valueOf方法的参数是fx:value属性定义的文字值。这意味着表达式绑定语法和\n照原样使用。 \n实际上是反斜杠,后跟“ n”,与在Java中使用"\\n"相同。


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

答案 1 :(得分:1)

我可以使用NotificationManager.areNotificationsEnabled()解决FXML中的多行问题。

&#xD;

然后我可以使用此代码引用<fx:define> <String fx:id="LABEL_01" fx:value="liczba czytelników&#xD;zarejestrowanych'}"/> </fx:define>

LABEL_01

这是解决方案之一,但是我仍然想知道如何引用变量<Label text="$LABEL_01"/>