2017-03-22 52 views
0

目前,當我想爲特定的窗格設置翻譯包時,我必須在加載之前執行此操作。讓我們考慮一個簡單的例子:是否可以在控制器類中設置Pane的recoures?

Bundle_en.properties

key=Sample Text 

MainApplication.java

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml")); 
     fxmlLoader.setResources(ResourceBundle.getBundle("bundles.Bundle",new Locale("en","EN"))); 
     Parent root = fxmlLoader.load(); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

現在我可以從包內使用的名稱:

sample.fxml

<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Label?> 

<GridPane fx:controller="sample.Controller" 
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> 
    <Label text="%key"/> 
</GridPane> 

問題:

是否可以將控制器內的資源設置爲initialize()方法?

Controller.java

public class Controller { 
    @FXML 
    private void initialize() { 
    // setting resources here 
    } 
} 

回答

0

據我所知,你在國際化兩種方式您的應用程序。從fxml文檔:

隨着文件被讀取,FXML文件的內容可以被本地化。對於 例如,如果FXML文件使用en_US區域設置加載,那麼它 產生字符串「名」爲基於以下 資源字符串標籤:

<Label text="%firstName"/>

如果locale 是將更改爲fr_FR FXML文件重新加載,然後 標籤顯示「Prénom」。

在另一方面,你可以從Java代碼更改值:

同樣不是Java代碼正確的,因爲你必須手動更新 用戶界面的每一個元素由內容獲取一個 對它的引用並調用相應的setter(例如 setText())。

另外ResourceBundle是Initializable接口中initialize方法的輸入參數,它在加載fxml文件時使用。

所以我不認爲有可能在初始化方法中設置資源。您可能稍後可能會從Controller中加載資源並從Java代碼中使用它們。不確定它是大型應用程序的最佳解決方案。

希望這會有所幫助。

0

我建議使用fx:root構造併爲每個自定義控件定義fxml和properties文件。

如果你喜歡跟隨一些簡單的命名約定,你可以使用一個實用工具類,我寫加載的文件FXML:

import org.drombler.commons.fx.fxml.FXMLLoaders; 
... 

public class MyPane extends SomePane { 

    public MyPane() { 
     FXMLLoaders.loadRoot(this); 
    } 

    ... 
} 

你可以在我的blog閱讀更多關於這一點。

相關問題