【问题标题】:Combine internationalized string with noninternationalized in fxml在 fxml 中结合国际化字符串和非国际化字符串
【发布时间】:2017-05-11 13:38:17
【问题描述】:

在我的 FXML 文件中

<Label text="%label.total" />

在属性文件中我有

label.total=Total

但是,我想在我的屏幕上显示Total:。不仅适用于这个标签,而且适用于 fxml 文件中的许多标签。我不想将: 添加到属性文件,因为这似乎是错误的,因为在这里我们必须只保留不同语言的字符串。

是否可以将"%label.total"":" 结合起来?还是在这种情况下使用了其他解决方案?

【问题讨论】:

  • 我找不到简单的方法来做到这一点。如果您可以在表达式绑定中使用资源解析(即text="${'%label.total'+':'}"),它会起作用,但资源解析不会在该字符串中解析(这是可以理解的)。此外,如果在表达式绑定中以与映射相同的方式处理资源包(并且如果您使用没有. 的键),则可以使用text="${resources.labelTotal + ':'}",但这也不起作用(看起来对于ResourceBundle 中的getLabelTotal() 方法)。后者似乎应该得到支持。
  • 我设法做到这一点的唯一方法是将资源包的所有内容转储到Map,并在加载之前将Map放入FXMLLoader的命名空间中FXML,非常丑陋。 (这个解决方案可能比使用两个标签更糟糕,一个带有文本,一个带有 :。)
  • 有时,我希望 JavaFX 控件中的方法不是 final
  • @ItachiUchiha 嗯,这是有充分理由的,但是是的,我知道你的意思

标签: java javafx fxml


【解决方案1】:

这看起来应该比现在更容易。 FXML 加载器在其命名空间中自动拥有资源包,其键为 resources。如果资源包是 java.util.Map,那么

<Label text="${resources.labelText + ':'}$ />

会起作用(属性文件中的键更改为labelText)。但是,FXMLLoader 对待资源包的方式与处理地图的方式不同,因此最终只是在资源包中寻找 getLabelText() 方法。允许以与地图属性相同的方式访问资源包属性的功能请求可能是值得的。

因此,一种可能的解决方案是将您需要的资源值复制到地图中。以下内容适用于您的原始属性文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.util.HashMap?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>


<VBox xmlns:fx="http://javafx.com/fxml/1">

    <fx:define>
        <HashMap fx:id="resourceAccess"
            labelTotal="%label.total"
        />              
    </fx:define>

    <Label text="${resourceAccess.labelTotal + ':'}" />

</VBox>

请注意,您可以根据需要在同一张地图中添加任意数量的属性,只需添加其他属性即可。这感觉有点做作,但确实有效。

您也可以在加载 FXML 时在 Java 代码中执行此操作:

    ResourceBundle resourceBundle = ResourceBundle.getBundle(...);

    FXMLLoader loader = new FXMLLoader(getClass().getResource(...), resourceBundle);

    Map<String, Object> resourceAccess = new HashMap<>();
    for (String key : resourceBundle.keySet()) {
        resourceAccess.put(key, resourceBundle.getObject(key));
    }
    loader.getNamespace().put("resourceAccess", resourceAccess);

    Parent root = loader.load() ;

然后是 FXML

<Label text="${resourceAccess.labelTotal + ':'}" />

将在没有 &lt;fx:define&gt; 块的情况下工作。但是,此解决方案再次禁止在资源键中使用 .(或者至少您必须将它们转换为 Java 代码中的其他内容:resourceAccess.put(key.replaceAll("\\.","_"), resourceBundle.getObject(key)); 或类似内容)。

目前还不能立即看出这是否比(也许更明显的)解决方法更好:

<HBox><Label text="%label.total"/><Label text=":"/></HBox>

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2022-06-22
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多