show
не ждет ответа пользователя, и вы должны опросить свойство result
, чтобы получить результат, например, при закрытии диалогового окна шрифта:
fs.setOnCloseRequest(e -> {
if (fs.getResult() != null) {
category1.setFont(fs.getResult());
}
});
Если вы хотитедождитесь ответа пользователя (и я полагаю, что вы этого хотите), вы можете использовать showAndWait
.Для этого просто замените
fs.show();
на
Optional<Font> optional = fs.showAndWait();
if (optional.isPresent()) {
category1.setFont(optional.get());
}
Подробнее см. showAndWait и show .
РЕДАКТИРОВАТЬ 1: Относительно ответа "РЕДАКТИРОВАТЬ: @Topaco Я попробовал ваш код"
Кажется, есть проблема из-за css
, точнее со строкой -fx-font-size: 2em;
.Проблема не связана напрямую с самим диалогом шрифтов (или show
- / showAndWait
-методом), также простой category1.setFont(...)
не работает в сочетании с css
по некоторым причинам.
Решение зависит от вашего кода.Если вы установили свойство styleClass
метки в вашем fxml
, возможное решение - определить размер шрифта вне css
с использованием свойства style
:
<Label fx:id="category1" ... styleClass="category-label" style="-fx-font-size: 2em;"/>
с
.category-label {
-fx-background-color: #8CA5FF;
-fx-text-fill: #fff;
-fx-padding: 0 0 0 20px;
}
Затем перед установкой шрифта удалите стиль с помощью category1.setStyle(null)
:
fs.setOnCloseRequest(e->{
if (fs.getResult() != null) {
category1.setStyle(null);
category1.setFont(fs.getResult());
}
});
Это должно работать.
РЕДАКТИРОВАТЬ 2: Относительно ответа «РЕДАКТИРОВАТЬ: Спасибо @Topaco за ответ, это работает! Но я хотел бы также изменить другое»
Язык, отображаемый в ControlsFX-элементы контролируются локалью, возвращаемой Localization.getLocale()
.Если ни одна локаль не была явно установлена с Localization.setLocale(...)
, используется локаль по умолчанию, возвращаемая Locale.getDefault()
(например, см. Диалоги ControlsFX и Локализация . Как правило, последняя определяетсяJVM из хост-системы (например, см. как установить локаль по умолчанию для моей JVM? ).
Таким образом, я предполагаю, что вашей локалью по умолчанию является русская локаль, котораяавтоматически берется, потому что вы, вероятно, не задали языковой стандарт с помощью Localization.setLocale(...)
.
Возможное решение - установить языковой стандарт в самом начале start
-метода с помощью
Localization.setLocale(new Locale("en","US"));
влияет на язык всех элементов ControlsFX на американский-английский.
Если нужно изменить только язык диалогового окна шрифта, установите локаль в самом начале changeFont
-метода и сбросьте егок старому значению в конце:
@FXML
void changeFont(ActionEvent event) {
try {
Locale locale = Localization.getLocale();
Localization.setLocale(new Locale("en", "US"));
FontSelectorDialog fs = new FontSelectorDialog(null);
fs.show();
fs.setOnCloseRequest(e->{
if (fs.getResult() != null) {
category1.setStyle(null);
category1.setFont(fs.getResult());
}
Localization.setLocale(locale); // Reset locale
});
} catch (Exception e) {
System.out.println("can't load new window");
}
}
Конечно, есть и другие возможности, например, вы можете изменить настройки в вашей хост-системе (что, конечно, имеет огромное влияние и за пределами вашего приложения).n и, скорее всего, вы этого не хотите) или изменение локали по умолчанию в начале метода start
с Locale.setDefault(...)
(которое влияет на все элементы, а не только на элементы ControlsFX).
РЕДАКТИРОВАТЬ 3: Относительно раздела РЕДАКТИРОВАНИЯ вопроса
1) Есть две незначительные проблемы.Во-первых, вопреки утверждению в предыдущем разделе EDIT, языковой стандарт en-US должен быть установлен на
Localization.setLocale(new Locale("", ""));
, как более подробно объяснено ниже.Во-вторых, вы должны вызвать этот метод до , когда вы создаете FontSelectorDialog
-инстанцию, т.е. в самом начале метода changeFont
, например:
@FXML
void changeFont(ActionEvent event) {
try {
Locale locale = Localization.getLocale();
Localization.setLocale(new Locale("", "")); // en-US
FontSelectorDialog fs = new FontSelectorDialog(null);
fs.show();
fs.setOnCloseRequest(e->{
if (fs.getResult() != null) {
category1.setStyle(null);
category1.setFont(fs.getResult());
}
Localization.setLocale(locale); // Reset locale
});
} catch (Exception e) {
System.out.println("can't load new window");
}
}
Этот код только меняет язык диалога шрифтов.В качестве альтернативы нет ничего неправильного в вызове Localization.setLocale(...)
в самом начале метода start
, который изменяет язык элементов ControlsFX во всем приложении.
Localization.setLocale(...)
-метод также описан в Диалоги ControlsFX , раздел «Локализация диалогов», пункт 5.
Здесь больше ничего не нужно делать, чтобы он работал, в частности, нет необходимости заменять русский текст в controlsfx_ru_RU.properties
-файле английским текстом .Напротив, это совершенно неверный способ, см. Ниже.
2) Относительно ваших файлов свойств: это точно источник, из которого читается информация о языке, т.е. если вы, например,установите языковой стандарт на русский язык с помощью Localization.setLocale(...)
, информация считывается с controlsfx_ru_RU.properties
.
В этом контексте, пожалуйста, обратите внимание, что оба суффикса в имени файла свойств, например, controlsfx_ru_RU.properties
, "ru" и "RU", соответственно, используются для создания экземпляра Locale
, который установлен сLocalization.setLocale(...)
-метод.Таким образом, русская локаль установлена с
Localization.setLocale(new Locale("ru", "RU"));
en-US - язык по умолчанию, который читается с controlsfx.properties
.Таким образом, en-US-locale устанавливается с
Localization.setLocale(new Locale("", ""));
и , а не с Localization.setLocale(new Locale("en", "US"));
, как можно было бы ожидать на первый взгляд.
В общем, выНе нужно изменять файлы свойств - за исключением того, что вы хотите заменить исходный текст пользовательским текстом.Для этого вам необходимо выполнить следующие действия: Скопировать файл свойств, затем внести изменения в копию и, наконец, поместить копию в папку src проекта.Теперь копия (с пользовательским текстом) используется вместо исходного файла свойств.Это также описано в ControlsFX Dialogs , раздел «Локализация диалогов», пункты 1 - 4.
Примечание : Как вы видите, каждый файл свойств соответствуетконкретный язык, определенный суффиксами в имени файла свойств.Использование языка, отличного от указанного в названии, не предусмотрено.Я упоминаю об этом явно, потому что вы указываете в отредактированном вопросе заменить русский текст в файле русских свойств текстом english . Не делайте этого (ни в исходном файле свойств, ни в копии)! Это просто сбивает с толку и совершенно не нужно (как описано выше).
3)Относительно «странных символов»: эти символы являются Unicode -кодами, определяющими кириллические буквы, например, \u041F
- это кодовая точка, определяющая кириллическую заглавную букву PE
, см. Кириллический скрипт в Unicode ,Поэтому, если вы, например, хотите заменить текущий русский текст в файле controlsfx_ru_RU.properties
новым русским текстом, вы должны использовать unicode-codepoints, которые соответствуют буквам вашего нового русского текста.