2016-10-07 2 views
0

У меня есть Choicebox, определенный в FXML с некоторыми статическими вариантами. Можно ли как-то определить переводы для каждого значения в 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> 

К сожалению, это не работает.

Возможно ли что-то подобное? Как?

В качестве альтернативы я мог бы создать этот список в методе init # Controller, но я бы предпочел не делать этого.

+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) и собрал остальных вместе –

Смежные вопросы