如何将ControlsFX字体选择器中的字体应用于标签?

时间:2018-12-23 10:46:22

标签: java css javafx scenebuilder

我正在使用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:我尝试了您的版本,但没有任何反应。我什至尝试在Main class中使用Localization,没有结果

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,但出现“警报”对话框:“无法创建文件”

1 个答案:

答案 0 :(得分:1)

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());
}

有关更多详细信息,请参见showAndWaitshow

编辑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()); } }); 删除样式:

Localization.getLocale()

这应该有效。

编辑2:关于答案“编辑:感谢@Topaco作为答案,它有效!但是我也想修改另一件事”

ControlsFX元素中显示的语言由Localization.setLocale(...)返回的语言环境控制。如果尚未使用Locale.getDefault()显式设置任何语言环境,则使用Localization.setLocale(...)返回的默认语言环境(例如,参见ControlsFX DialogsLocalization。通常,后者由JVM确定)来自主机系统(例如,参见how do I set the default locale for my JVM?)。

因此,我假设您的默认语言环境是自动获取的俄语语言环境,因为您可能未使用start设置语言环境。

一种可能的解决方案是使用

Localization.setLocale(new Locale("en","US")); 方法的最开始设置区域设置。
changeFont

影响所有ControlsFX元素的语言为美国英语。

如果仅应更改字体对话框的语言,请在@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"); } } 方法的最开始处设置语言环境,并在结尾处将其重置为旧值:

start

当然,还有其他可能性,例如您可以更改主机系统中的设置(当然,这也会在您的应用程序外部产生很大的影响,并且很可能您确实不希望这样做),也可以在应用程序范围的开始更改默认语言环境Locale.setDefault(...)Localization.setLocale(new Locale("", "")); 一起使用的方法(这会影响所有元素,而不仅会影响ControlsFX元素)。

编辑3:关于问题的“编辑”部分

1)有两个小问题。首先,与上一个EDIT部分中的声明相反,必须使用

设置en-US-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方法的非常开始处调用Localization.setLocale(...)并没有错,该方法会更改整个应用程序中ControlsFX元素的语言。 / p>

ControlsFX Dialogs的“本地化对话框”部分的第5点中也介绍了controlsfx_ru_RU.properties方法。

这里没有其他事情可以使它起作用,特别是没有必要用英语替换Localization.setLocale(...)文件中的俄语文本。相反,这是完全错误的方法,请参见下文。

2)关于您的属性文件:这是完全的来源,可以从中读取语言信息,即您是否使用controlsfx_ru_RU.properties将语言环境设置为俄语语言环境,信息将从controlsfx_ru_RU.properties中读取。

在这种情况下,请注意,这两个后缀均以属性文件的名称开头,例如Locale,“ ru”和“ RU”分别用于实例化用Localization.setLocale(...)方法设置的Localization.setLocale(new Locale("ru", "RU")); 。因此,俄语语言环境设置为

controlsfx.properties

en-US是从Localization.setLocale(new Locale("", "")); 中读取的默认语言。因此,en-US-locale设置为

Localization.setLocale(new Locale("en", "US"));
乍看之下,{p>和\u041F一样。

通常,您不必更改属性文件-唯一的例外是您要用自定义文本替换原始文本。为此,您必须执行以下步骤:复制properties-file,然后在副本中进行更改,最后将副本放入项目的src文件夹中。现在,使用副本(带有自定义文本)代替原始的属性文件。 ControlsFX Dialogs的“本地化对话框”一节中的第1-4点也对此进行了描述。

注意:如您所见,每个属性文件都对应于由属性文件名称中的后缀定义的特定语言。不打算使用名称中未指定的语言。我之所以明确提及是因为您在编辑后的问题中指出,用 english 文本替换俄语properties-file中的俄语文本。 不要这样做(既不在原始属性文件中也不在副本中!)那只是令人困惑,根本没有必要(如上所述)。

3)关于“奇怪的符号”:这些符号是Unicode-代码点,定义西里尔字母,例如PE是定义西里尔大写字母controlsfx_ru_RU.properties的代码点,请参见Cyrillic script in Unicode。所以如果你想要用新的俄语文本替换{{1}}文件中的当前俄语文本,则必须使用与您的新俄语文本字母相对应的unicode码点。