Java 如何使用方法将按钮添加到面板并从主菜单访问它?

Java 如何使用方法将按钮添加到面板并从主菜单访问它?,java,methods,javafx,Java,Methods,Javafx,假设我想创建一个方法,将一个按钮添加到StackPane。然后我想访问该按钮,例如,我想从主菜单添加一个EventHandler: public class Test extends Application { @Override public void start(Stage primaryStage) throws ParseException { StackPane root = new StackPane(); addBu

假设我想创建一个方法,将一个按钮添加到
StackPane
。然后我想访问该按钮,例如,我想从主菜单添加一个
EventHandler

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) throws ParseException {       

        StackPane root = new StackPane();
        addButton(root);
        // HERE I WANT TO ADD AN EVENT HANDLER TO b BUT I CANNOT ACCESS IT
        // b.addEventHandler(); 
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void addButton(StackPane sp){
        final Button b = new Button("Test");
        sp.getChildren().add(b);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

在创建按钮时向按钮添加事件处理程序

public void addButton(StackPane sp){
    final Button b = new Button("Test");
    b.setOnAction(new EventHandler<ActionEvent>() {
       @Override 
       public void handle(ActionEvent e) {
                //your logic
       }});
    sp.getChildren().add(b);
}
公共作废添加按钮(StackPane sp){
最终按钮b=新按钮(“测试”);
b、 setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
//你的逻辑
}});
sp.getChildren().add(b);
}

因为按钮是您的
addButton
的本地按钮,所以您需要对其进行引用。从
addButton
方法返回按钮的引用并使用它

这样使用会更好

public Button addButton(){
     //create Button
}
您可以将此按钮添加到
start()中的
StackPane

或者

不建议采用这种方法

您可以从堆栈窗格中取出
按钮

Button  button = (Button)root.getChildren().get(0);
N.B.仅当您确定按钮的位置时才使用此选项

更新 如果您只想将设计与控件执行的操作分开,JavaFX提供了一种eligant方法,使用


它可以帮助您设计UI,而不需要对用户需要执行的操作进行任何放纵。以后,这些FXML可以通过控制器(Java接口)绑定到它们的操作上。

将UI控件的作用域绑定到应用程序类的实例上,而不是使它们位于方法的本地

public class Test extends Application {

    private Button b ;

    public void start(Stage primaryStage) throws Exception {
        StackPane root = new StackPane();
        addButton(root);

        b.addEventHandler(...);

        // ...
    }

    private void addButton(Pane pane) {
        b = new Button("Test");
        pane.getChildren().add(b);
    }

    // ...
}

或者,如果您真的想将布局与事件处理分离,请在FXML中进行布局,并将控件注入控制器类,该类可以负责事件处理程序。

是的,这是一个很好的解决方案,但不是我真正需要的。假设我必须能够从main引用b。您可以使用
e.getSource()
,或者您可以调用
handle
一个main方法,并将
b
作为参数。如果我有几个按钮、标签、文本字段要添加到根面板,并且我想创建一个方法setUpGUI()thant创建并将我的对象放在面板上,然后我想创建一个方法,将listener添加到这些对象中?我希望我的问题很清楚:)你将如何决定将哪个侦听器添加到哪个按钮?为了避免这种混淆,按钮上的操作都写在创建按钮的地方。不过,如果您想实现这一点,您可以在
root.getChildren()
上运行一个循环,并检查它是否是
按钮的实例,如果是,则应用任何逻辑将一个按钮与另一个按钮分开,并向其添加侦听器