我正在使用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");
}
但是语言不会改变。我还找到了带有语言的文件,我想在那里用俄语编辑文件
其他语言具有这样的字符串:
但是俄语有奇怪的符号:
我不知道如何更改这些符号以使示例文本变为英语。 有什么想法吗?
编辑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
但是当我将此文件与其他文件粘贴到目录中时,会出现警告对话框,即使没有这样的文件也是如此:
我也试图将名称更改为 controlsfx_eng_USA.properties,但出现“警报”对话框:“无法创建文件”
答案 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());
}
有关更多详细信息,请参见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());
}
});
删除样式:
Localization.getLocale()
这应该有效。
编辑2:关于答案“编辑:感谢@Topaco作为答案,它有效!但是我也想修改另一件事”
ControlsFX元素中显示的语言由Localization.setLocale(...)
返回的语言环境控制。如果尚未使用Locale.getDefault()
显式设置任何语言环境,则使用Localization.setLocale(...)
返回的默认语言环境(例如,参见ControlsFX Dialogs和Localization。通常,后者由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-localeFontSelectorDialog
,如以下更详细说明。其次,必须在创建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码点。