带翻译的FXML选择框

时间:2016-10-07 14:30:15

标签: java javafx fxml

我在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方法中创建该列表,但我宁愿不这样做。

1 个答案:

答案 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);
    }
}

enter image description here