2016-10-07 67 views
0

我在FXML中定義了一個Choicebox,並帶有一些靜態選項。是否有可能爲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方法中創建該列表,但我寧願不這樣做。

+1

我覺得這是最近問了,雖然我現在不能找到它,而結論是,資源的分辨率不'FX工作:value'(可悲)。您可能必須在控制器中執行此操作。 –

+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

+0

Thx。你是如何找到解決方案的?嘗試和錯誤,或者是否有關於此主題的好書或文檔? –

+1

我剛剛使用了[FXML文檔](https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html),並將其餘部分拼接在一起 –