我正在使用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,但出现“警告”对话框:“无法创建文件”
最佳答案
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 Dialogs和Localization。通常,后者由JVM从主机系统确定(例如,参见how do I set the default locale for my 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");
}
}
当然,还有其他可能性,例如您可以更改主机系统中的设置(当然,这也会在您的应用程序外部产生很大的影响,并且很可能您确实不希望这样做),也可以在应用程序范围的开头更改默认语言环境
start
-Locale.setDefault(...)
方法(影响所有元素,不仅影响ControlsFX元素)。编辑3:关于问题的编辑部分
1)有两个小问题。首先,与上一个EDIT部分中的陈述相反,必须使用以下命令设置en-US-locale
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 Dialogs的“本地化对话框”部分的第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"));
那样。通常,您不必更改属性文件-唯一的例外是您要用自定义文本替换原始文本。为此,您必须执行以下步骤:复制properties-file,然后在副本中进行更改,最后将副本放入项目的src文件夹中。现在,使用副本(带有自定义文本)代替原始的属性文件。
在ControlsFX Dialogs的“本地化对话框”部分的第1-4点中也对此进行了描述。
注意:如您所见,每个属性文件都对应于由属性文件名称中的后缀定义的特定语言。不打算使用名称中未指定的语言。我之所以明确提及,是因为您在编辑的问题中指出要用英文文本替换俄文属性文件中的俄文文本。不要这样做(既不在原始properties文件中也不在副本中)!这只是令人困惑,根本没有必要(如上所述)。
3)关于“奇怪的符号”:这些符号是定义西里尔字母的Unicode-码点,例如
\u041F
是定义西里尔大写字母PE
的代码点,请参见Cyrillic script in Unicode。所以如果你想要用新的俄语文本替换controlsfx_ru_RU.properties
文件中的当前俄语文本,您必须使用与您的新俄语文本字母相对应的unicode-codepoints。