Как применить шрифт из ControlsFX Font Selector к метке? - PullRequest
0 голосов
/ 23 декабря 2018

Я делаю приложение, используя JavaFX и Scene Builder

У меня есть метка:

@FXML
private Label category1;

Когда я нажимаю на кнопку переключения, вызывается метод:

@FXML
void changeFont(ActionEvent event) {
try {
  FontSelectorDialog fs = new FontSelectorDialog(null);
  fs.setTitle("Select Font");
  fs.setHeaderText("");
  fs.setContentText("asdasdada");
  fs.show();

} catch (Exception e) {
  System.out.println("can't load new window");
}

}

Отображается диалог ControlFX FontSelector, в котором я могу выбрать семейство шрифтов, стиль шрифта и размер шрифта. Также есть две кнопки «ОК» и «ОТМЕНА»

Как применить изменения в этом диалоговом окне к моей метке, когда янажмите кнопку «ОК»?

РЕДАКТИРОВАТЬ:

Я пробовал эту строку в коде с «en» и «US», но ничего не происходит.

FontSelectorDialog fs = new FontSelectorDialog(null);
      fs.setTitle("Select Font");
      fs.setHeaderText("");
      Localization.setLocale(new Locale("en", "US"));
      fs.show();
      fs.setOnCloseRequest(e -> {
        if (fs.getResult() != null) {
          category1.setFont(fs.getResult());
        }
      });

    } catch (Exception e) {
      System.out.println("can't load new window");
    }

Но язык не меняется.Я также нашел файлы с языками, и я хотел там отредактировать файл с русским языком

Languages

В других языках есть такие строки:

DEutch language

Но в русском языке есть странные символы:

Russian language

Я не знаю, какизмените эти символы, чтобы образец текста стал на английском языке.Есть идеи?

РЕДАКТИРОВАТЬ 2: Я попробовал вашу версию и ничего не происходит.Я даже пытался использовать локализацию в основном классе, без результатов

Locale locale = Localization.getLocale();
      Localization.setLocale(new Locale("en", "US")); // 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
      });

Я скопировал файл controlsfx.properties, изменил имя на controlsfx_en_US.properties

, но когда я вставил этот файл в каталог споявляется диалоговое окно с предупреждением о других файлах, даже если такого файла с таким именем нет:

EN US

Я также пытался изменить имя на controlsfx_eng_USA.properties,но появляется диалоговое окно Alert: «Файл не может быть создан»

1 Ответ

0 голосов
/ 23 декабря 2018

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, которые соответствуют буквам вашего нового русского текста.

...