带翻译的 FXML 选择框
FXML choicebox with translations
我有一个用 FXML 定义的带有一些静态选项的选择框。是否可以通过某种方式为 FXML 中的每个值定义翻译?
我当前的代码如下所示:
<ChoiceBox fx:id="category">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Message" />
<String fx:value="Request" />
<String fx:value="Error" />
</FXCollections>
</items>
</ChoiceBox>
现在我想像这样直接使用翻译:
<ChoiceBox fx:id="category">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="%category.message" />
<String fx:value="%category.request" />
<String fx:value="%category.error" />
</FXCollections>
</items>
</ChoiceBox>
很遗憾,这不起作用。
有类似的可能吗?怎么样?
作为替代方案,我可以在 Controller#init 方法中创建该列表,但我宁愿不这样做。
fx:value
属性只会解释文字字符串,因此无法解析资源或表达式。恕我直言,这是设计缺陷。
我发现了这个有点迂回的解决方法。您可以使用所需的资源创建地图,然后只需使用 <fx:reference>
访问地图的元素:
<fx:define>
<HashMap fx:id="rscBndl"
message="%category.message"
request="%category.request"
error="%category.error" />
</fx:define>
<ChoiceBox >
<items>
<FXCollections fx:factory="observableArrayList">
<fx:reference source="rscBndl.message" />
<fx:reference source="rscBndl.request" />
<fx:reference source="rscBndl.error" />
</FXCollections>
</items>
</ChoiceBox>
这是一个 SSCCE:
ResourceTest.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String ?>
<?import java.util.HashMap ?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1">
<fx:define>
<HashMap fx:id="rscBndl"
message="%category.message"
request="%category.request"
error="%category.error" />
</fx:define>
<top>
<ChoiceBox >
<items>
<FXCollections fx:factory="observableArrayList">
<fx:reference source="rscBndl.message" />
<fx:reference source="rscBndl.request" />
<fx:reference source="rscBndl.error" />
</FXCollections>
</items>
</ChoiceBox>
</top>
</BorderPane>
resources.properties:
category.message = Message
category.request = Request
category.error = Error
ResourceTest.java
import java.io.IOException;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class ResourceTest extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
ResourceBundle resources = ResourceBundle.getBundle("resources");
FXMLLoader loader = new FXMLLoader(getClass().getResource("ResourceTest.fxml"), resources);
Scene scene = new Scene(loader.load(), 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我有一个用 FXML 定义的带有一些静态选项的选择框。是否可以通过某种方式为 FXML 中的每个值定义翻译?
我当前的代码如下所示:
<ChoiceBox fx:id="category">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Message" />
<String fx:value="Request" />
<String fx:value="Error" />
</FXCollections>
</items>
</ChoiceBox>
现在我想像这样直接使用翻译:
<ChoiceBox fx:id="category">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="%category.message" />
<String fx:value="%category.request" />
<String fx:value="%category.error" />
</FXCollections>
</items>
</ChoiceBox>
很遗憾,这不起作用。
有类似的可能吗?怎么样?
作为替代方案,我可以在 Controller#init 方法中创建该列表,但我宁愿不这样做。
fx:value
属性只会解释文字字符串,因此无法解析资源或表达式。恕我直言,这是设计缺陷。
我发现了这个有点迂回的解决方法。您可以使用所需的资源创建地图,然后只需使用 <fx:reference>
访问地图的元素:
<fx:define>
<HashMap fx:id="rscBndl"
message="%category.message"
request="%category.request"
error="%category.error" />
</fx:define>
<ChoiceBox >
<items>
<FXCollections fx:factory="observableArrayList">
<fx:reference source="rscBndl.message" />
<fx:reference source="rscBndl.request" />
<fx:reference source="rscBndl.error" />
</FXCollections>
</items>
</ChoiceBox>
这是一个 SSCCE:
ResourceTest.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String ?>
<?import java.util.HashMap ?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1">
<fx:define>
<HashMap fx:id="rscBndl"
message="%category.message"
request="%category.request"
error="%category.error" />
</fx:define>
<top>
<ChoiceBox >
<items>
<FXCollections fx:factory="observableArrayList">
<fx:reference source="rscBndl.message" />
<fx:reference source="rscBndl.request" />
<fx:reference source="rscBndl.error" />
</FXCollections>
</items>
</ChoiceBox>
</top>
</BorderPane>
resources.properties:
category.message = Message
category.request = Request
category.error = Error
ResourceTest.java
import java.io.IOException;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class ResourceTest extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
ResourceBundle resources = ResourceBundle.getBundle("resources");
FXMLLoader loader = new FXMLLoader(getClass().getResource("ResourceTest.fxml"), resources);
Scene scene = new Scene(loader.load(), 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}