我在FXML中定义了一个具有一些静态选择的Choicebox。在某种程度上可以为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方法中创建该列表,但我宁愿不这样做。
答案 0 :(得分:3)
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);
}
}