Обратитесь к многострочной строковой переменной из блока fx: define - PullRequest
0 голосов
/ 15 января 2019

Я определил многострочную строковую переменную в 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 голосов
/ 15 января 2019

Хочу отметить, что этот фрагмент кода работает:

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

Возможно, это не так, как вы думаете.

Синтаксис ${} является привязкой выражения . Это связывает целевое свойство (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) с использованием метода класса static valueOf(String). Аргумент для метода valueOf является литеральным значением, определенным атрибутом fx:value. Это означает, что синтаксис привязки выражения и \n используются как есть. \n является буквально обратной косой чертой, за которой следует «n», так же как и использование "\\n" в Java.


Файл FXML по своей сути является просто файлом XML. Насколько я могу судить, формат FXML не обеспечивает специальной многострочной поддержки за пределами строковых констант в привязке выражений. Однако вы можете использовать экранирование XML для вставки символов новой строки (т. Е. ваше решение ).

0 голосов
/ 15 января 2019

Я могу использовать &#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'}"?

...