Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在start()之外更改JavaFX的GUI?_Java_Swing_Javafx - Fatal编程技术网

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

如何在start()之外更改JavaFX的GUI?,java,swing,javafx,Java,Swing,Javafx,我非常喜欢JavaFX的特性,在Swing中,我可以做到 @Override public void onPluginRegistered(final GamePlugin plugin) { JRadioButtonMenuItem gameMenuItem = new JRadioButtonMenuItem(plugin.getGameName()); gameMenuItem.setSelected(false); gameMenu

我非常喜欢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);
    }

当我调用<代码> OnPuxLin注册(DATApLuin插件)< /C> >(新的ReloButt没有出现)

< P>时,我不能添加任何单选按钮,你应该考虑<代码> Stup())/Case>方法作为<代码>主< /COD>方法的替换。如果应用程序需要访问某种服务或模型,请在
start()
(或
init()
)方法中创建它。实际上,我建议将
应用程序
子类(本质上是不可重用的)设置得尽可能小-它应该只做启动工作-并将剩余的GUI代码分解成一个单独的类。(如果使用FXML,FXML文件可以定义UI,而
应用程序
子类已经非常小了:它只是加载并显示FXML。)

您还没有提供足够的上下文来说明这里发生了什么,但我猜
GuiFramework
是您所展示的
Application
子类的一部分,而
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
类:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        DataFramework core = new ConcreteDataFramework();
        GuiFramework gui = new GuiFramework(core);
        core.addGuiListener(gui);

        Scene scene = new Scene(gui.getView(), 500, 500);
        scene.getStylesheets().add("./Buttons.css");

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

        core.registerPlugin(new CsvData());
    }

    // for environments not supporting JavaFX launch automatically:
    public static void main(String[] args) {
        launch(args);
    }
}

你能发布有问题的JavaFX代码吗?我不理解这个问题。当然,您可以在运行时添加javafx元素。对不起,帖子已经更新了。你不能把代码从
main
方法移到
start
方法吗。您应该将
start
方法看作是JavaFX应用程序中
main
的替代方法。(即,应用程序以
start()
开始)调用
onPluginRegistered
的位置(无论如何,对我来说)并不清楚。请在
start()
方法中创建它,而不是传递它。我不知道你在这里错过了什么<代码>开始()是执行开始的地方。忘记
main
存在(JavaFX应用程序可能没有
main
方法,即使有,也可能不会执行)。我不知道什么是
DataFramework
GuiFramework
,所以很难回答这个问题。
GuiFramework
是您的
应用程序的子类吗?什么是注册的插件
,它覆盖了什么?你给我们留下了太多让我们猜不到的东西\
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        DataFramework core = new ConcreteDataFramework();
        GuiFramework gui = new GuiFramework(core);
        core.addGuiListener(gui);

        Scene scene = new Scene(gui.getView(), 500, 500);
        scene.getStylesheets().add("./Buttons.css");

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

        core.registerPlugin(new CsvData());
    }

    // for environments not supporting JavaFX launch automatically:
    public static void main(String[] args) {
        launch(args);
    }
}