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()
上运行一个循环,并检查它是否是按钮的实例,如果是,则应用任何逻辑将一个按钮与另一个按钮分开,并向其添加侦听器