如何在start()之外更改JavaFX的GUI?
我非常喜欢JavaFX的特性,在Swing中,我可以做到如何在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
@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);
}
}