【问题标题】:Language of JavaFX color pickerJavaFX 颜色选择器的语言
【发布时间】:2015-06-19 04:35:15
【问题描述】:

有没有办法更改ColorPicker 的文本语言,例如“自定义颜色...”、“当前颜色”、“新颜色”、“色调”、“饱和度”、“亮度”、“不透明度”、“保存”、“使用”、“取消”?

【问题讨论】:

标签: java javafx color-picker


【解决方案1】:

编辑:以下答案适用于那些需要更多异国语言的人。如果您使用其中之一:de, es, fr, it, ja, ko, pt, sv, zh@sergey-grinev 提供了足够的答案。


我想出了两个解决方案。两者都依赖properties 文件。您可以根据 JRE 提供的 jxfrt.jar 中的 com/sun/javafx/scene/control/skin/resources/ 中的示例创建自己的示例。

所有示例都将使用非内置的波兰语语言环境 (new Locale("pl", "PL"))。


解决方案 1

创建具有以下结构的 JAR 文件(相应地更改后缀)

com/sun/javafx/scene/control/skin/resources/controls_pl_PL.properties

并将其放入

<path_to_JVM>/lib/ext

就是这样。

我不确定许可证中关于将自定义文件放在 com.sun.* 包中的内容,所以这里有另一个解决方案。

解决方案 2

像上面一样创建properties 文件,但是您可以将其命名为任意名称并将其放置在您想要的任何位置。假设它会是

path/to/my/resources/polish.properties

像这样创建两个类 - ResourceBundle.ControlResourceBundleControlProvider (read more)。

public class CustomLocaleFxResourceBundleControl extends ResourceBundle.Control {
    static final String FX_BASE_NAME = "com/sun/javafx/scene/control/skin/resources/controls";
    private static final Locale MY_LOCALE = new Locale("pl", "PL");

    @Override
    public String toBundleName(String baseName, Locale locale) {
        if (FX_BASE_NAME.equals(baseName) && MY_LOCALE.equals(locale))
            return "path/to/my/resources/polish"; // without extension

        return super.toBundleName(baseName, locale);
    }
}
public class CustomLocaleFxResourceBundleControlProvider implements ResourceBundleControlProvider {
    private static final ResourceBundle.Control MY_RESOURCE_BUNDLE_CONTROL = new CustomLocaleFxResourceBundleControl();

    public ResourceBundle.Control getControl(String baseName) {
        if (CustomLocaleFxResourceBundleControl.FX_BASE_NAME.equals(baseName))
            return MY_RESOURCE_BUNDLE_CONTROL;

        return null;
    }
}

编译这些类并将它们与您的资源和META-INF 文件夹一起放入JAR 文件中。 META-INF 文件夹应具有以下结构

META-INF/services/java.util.spi.ResourceBundleControlProvider

java.util.spi.ResourceBundleControlProvider 是一个文本文件,其中只有一行是ResourceBundleControlProvider 类的路径。在我们的例子中,它只是

CustomLocaleFxResourceBundleControlProvider

完整的JAR放入

<path_to_JVM>/lib/ext

【讨论】:

  • 这是我第一次进行此类更改,但遇到了一些麻烦。我正在使用 Eclipse(jdk 1.8.40) 并且找不到您上面提到的属性文件。
  • &lt;jdk_installation_directory&gt;/jre/lib/ext 中有jfxrt.jar。复制它,将扩展名更改为zip,解压并查看我的答案中提到的目录。
  • 谢谢,我检索了所需的属性文件并对其进行了更改。我在 bin\com\my 文件夹(mainApp 所在的位置)中创建了 CustomLocaleFxResourceBundleControlProvider 和 CustomLocaleFxResourceBundleControl,还放了 controls_pl.properties 文件。但是我对“编译这些类并将它们与您的资源和 META-INF 文件夹一起放入 JAR 文件中。META-INF 文件夹应该具有以下结构”感到困惑。我只是不明白到底该怎么做。我在 Java 方面处于初学者水平,还不能全部理解。
  • 如果我没记错的话,Eclipse 正在即时编译程序。我应该手动编译这两个类吗?不明白我应该把这些类放在哪个罐子里。在同一个 jar 中,我从中获取了属性文件?如果我查看我正在使用的 Java FX DDK,它有 org.eclipse.fx.ide.css.jfx8_1.0.0.jar,其中 META-INF 中只有 maven 文件夹。我应该创建 META-INF/services/java.util.spi.ResourceBundleControlProvider 吗?
  • 您可以手动准备所需的目录结构(screen)。进入toJar文件夹,全选,右键,添加到ZIP压缩包(取决于你安装的软件)。之后将结果.zip 的扩展名更改为.jar。您可以从 eclipse 项目中的 bin 目录中选择 .class 文件。在您的情况下,首先将它们移动到默认包 - JAR 中声明的包和路径必须相同。
【解决方案2】:

最简单的方法是使用预定义的语言环境之一,例如在创建 ColorPicker 之前添加下一行:

Locale.setDefault(Locale.FRENCH);

您将看到下一个 UI:

【讨论】:

  • 它适用于法语。但是,如果我需要为其他语言(如俄语或爱沙尼亚语)创建 ColorPicker,该怎么办?尝试使用`Locale dLocale = new Locale("ru"); Locale.setDefault(dLocale);` ,但它不起作用。
  • @user3629015 大声笑,俄语和爱沙尼亚语是我除了英语之外还会说的两种语言 :) 看看这个案例中的 3ph3r 答案。
  • почему все всегда забывают про русских?(
  • @sinedsem Я не забыл, смотрите мой ответ здесь stackoverflow.com/a/45979456/3937190
  • @AndreiKrasutski 谢谢,但我已经对 JavaFX 和桌面 Java 开发感到失望
猜你喜欢
  • 2016-06-29
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2017-04-06
  • 2013-09-27
  • 2023-04-07
相关资源
最近更新 更多