Java FX资源包和内部化-MenuBar中RadioMenuItems的实现

时间:2018-11-12 09:52:20

标签: java javafx

我目前正在开发应用程序中的内部化功能。

我创建了2个文件,2种可用语言的捆绑包文件夹:

messages_pl.properties and messages_en.properties.

在主fxml文件(也包含menuBar)中,为每个控件设置内部化资源。

这段代码非常适合我,我可以从“ en”切换为“ pl”

public void start(Stage primaryStage) throws Exception {        
    Locale.setDefault(new Locale("en"));
    Pane borderPane = FxmlUtils.fxmlLoader(BORDER_PANE_MAIN_FXML);
    Scene scene = new Scene(borderPane);
    primaryStage.setScene(scene);
    primaryStage.setTitle(FxmlUtils.getResourceBundle().getString("tittle.application"));
    primaryStage.show();

问题是我不想操纵代码,每次需要更改语言时都从en切换到pl。

如果我选择RadioMenuItem“波兰语”或RadioMenutItem“英语”,我希望动态地使用它。

您知道如何修改我的源代码吗?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,它不是最漂亮的,但它可以起作用:

Controller

public class Controller implements Initializable {

    @FXML
    private MenuItem en;
    @FXML
    private MenuItem de;

    Runnable changeLanguage; // add setter

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        en.setOnAction(event -> {
            Locale.setDefault(Locale.ENGLISH);
            reload();
        });
        de.setOnAction(event -> {
            Locale.setDefault(Locale.GERMAN);
            reload();
        });
    }
    private void reload() {
        changeLanguage.run();
    }
}

Main

public class Main extends Application {

    private Stage primary;

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primary = primaryStage;
        load();
        primaryStage.show();
    }

    private void load() throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
        loader.setResources(ResourceBundle.getBundle("stackoverflow/language/language", Locale.getDefault())); // the main package is stackoverflow which contains language
        primary.setScene(new Scene(loader.load(), 400, 600));
        Controller controller = loader.getController();
        controller.changeLanguage = () -> {
            try {
                load();
            } catch (IOException e) {
                e.printStackTrace();
            }
        };
    }

    public static void main(String[] args) {
        Locale.setDefault(Locale.ENGLISH);
        launch(args);
    }

}

View.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuItem?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="stackoverflow.language.Controller">
    <MenuBar>
        <Menu text="%language">
            <MenuItem fx:id="en" text="%en"/>
            <MenuItem fx:id="de" text="%de"/>
        </Menu>
    </MenuBar>
</AnchorPane>

这是类的方式:

enter image description here