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

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

最佳答案

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


这应该工作。

编辑2:关于答案“编辑:感谢@ Topaco的答案,它的工作原理!但我也想修改另一件事”

ControlsFX元素中显示的语言由Localization.getLocale()返回的语言环境控制。如果没有使用Localization.setLocale(...)明确设置语言环境,则使用Locale.getDefault()返回的默认语言环境(例如,参见ControlsFX DialogsLocalization。通常,后者由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。

关于java - 如何将ControlsFX字体选择器中的字体应用于标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53902942/

相关文章:

resize - JavaFX - SplitPane,调整大小和比例

java - Spring Java,加载xml时找不到文件

jquery - 选择另一个元素后删除或设置属性值

css - WP CSS Overlapping menus 子菜单无法摆脱背景图片

JavaFX:TableView 使用 ObservableList 中的特定数据填充列

JavaFX TextField 抛出 NullPointerException

java - 在哪里设置 eclipse mars 的 java 堆大小?

java - 抽象类具体方法调用

java - 如何让 doInBackground() 等待 AsyncTask 类中的另一个函数?

javascript - <ul> 中的每个 <li> 如何才能在不影响其他 <ul> 的情况下更改其类名?