如何在start()之外更改JavaFX的GUI?

时间:2016-04-04 15:34:20

标签: java swing javafx

我对JavaFX的功能很着迷,在Swing中,我能做到,

@Override
    public void onPluginRegistered(final GamePlugin plugin) {
        JRadioButtonMenuItem gameMenuItem = new JRadioButtonMenuItem(plugin.getGameName());
        gameMenuItem.setSelected(false);
        gameMenuItem.addActionListener(event -> {
            if (core.getPlayers().isEmpty()) {
                // Can't start a game with no players.
                showErrorDialog(frame, ERROR_NO_PLAYERS_TITLE, ERROR_NO_PLAYERS_MSG);
                gameGroup.clearSelection();
            } else {
                core.startNewGame(plugin);
            }
        });
        gameGroup.add(gameMenuItem);
        newGameMenu.add(gameMenuItem);
    }

如果我想在插件注册时添加广播项目。 但是在JavaFX中,似乎不能声明JavaFX的任何全局项,因为一旦调用了start(),它就会启动一个新的构造函数,之前你所做的一切都是空的(没有变量)分享给我)。

这是我的Javafx代码。

@Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        Scene scene = new Scene(root, 500, 500);
        scene.getStylesheets().add("./Buttons.css");

        Region spacer = new Region();
        spacer.setMinWidth(10);

        primaryStage.setScene(scene);
        primaryStage.show();

        TabPane tabPane = new TabPane();
        Tab tabData = new Tab("Get your data");
        tabPane.getTabs().add(tabData);
        Tab tabDisplay = new Tab("Visualize your data");
        tabPane.getTabs().add(tabDisplay);

        pluginGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>(){
            @Override
            public void changed(ObservableValue<? extends Toggle> ov,
                Toggle old_toggle, Toggle new_toggle) {
                    if (pluginGroup.getSelectedToggle() != null) {
                        RadioButton chk = (RadioButton) new_toggle.getToggleGroup().getSelectedToggle();
                        chk.getText();
                    }
                }

        });

        root.setCenter(tabPane);

        FlowPane inputPanel = new FlowPane();
        TextField source = new TextField ();
        Button confirmButton = new Button("Get Your Resource!");
        confirmButton.getStyleClass().add("GREEN");
        inputPanel.getChildren().addAll(new Label("Input your source:"),
                spacer, source, confirmButton);
        root.setBottom(inputPanel);

        RadioButton defaultBtn = new RadioButton("No data plugin are registered");
        FlowPane pane = new FlowPane();
        pane.getChildren().addAll(new Label("Select your data source"), spacer);
        if (radioButtonBox != null) {
            pane.getChildren().add(radioButtonBox);
        }
        tabData.setContent(pane);
    }

    @Override
    public void onPluginRegistered(DataPlugin plugin) {
        RadioButton button = new RadioButton(plugin.getName());
        button.setToggleGroup(pluginGroup);
        radioButtonBox.getChildren().add(button);
    }

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

我想从

初始化javafx程序
public static void main(String[] args) throws Exception {
    DataFramework core = new ConcreteDataFramework();
    GuiFramework gui = new GuiFramework(core);
    core.addGuiListener(gui);

    gui.caller(args);

    core.registerPlugin(new CsvData());
}

每次拨打onPluginRegistered(DataPlugin plugin)时都无法向现有的radioButtonBox添加任何单选按钮(新的无线电按钮没有显示),这很奇怪

1 个答案:

答案 0 :(得分:0)

您应该将start()方法视为main方法的替代方法。如果您的应用程序需要访问某种服务或模型,请使用start()(或init())方法创建它。我实际上建议尽可能减少Application子类(本质上不可重用) - 它应该只是执行启动工作 - 并将剩余的GUI代码分解为一个单独的类。 (如果使用FXML,FXML文件可以定义UI,Application子类已经很小了:它只是加载并显示FXML。)

你还没有真正提供足够的背景来清楚这里发生了什么,但我猜测GuiFramework是你展示过的Application子类,{{1}是某种界面。我还假设DataFramework正在实现一些定义GuiFramework方法的接口。

所以我会这样做:

onPluginRegistered

并定义一个public class GuiFramework implements PluginAware { private final BorderPane root ; private final DataFramework dataFramework ; public GuiFramework(DataFramework dataFramework) { this.dataframework = dataFramework ; this.root = new BorderPane(); TabPane tabPane = new TabPane(); Tab tabData = new Tab("Get your data"); tabPane.getTabs().add(tabData); // etc etc (remaining code from your start() method) } public Parent getView() { return root ; } @Override public void onPluginRegistered(DataPlugin plugin) { RadioButton button = new RadioButton(plugin.getName()); button.setToggleGroup(pluginGroup); radioButtonBox.getChildren().add(button); } } 类来启动应用程序:

Main