假设我想创建一个向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);
}
}
答案 0 :(得分:1)
创建按钮时将事件处理程序添加到按钮
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);
}
答案 1 :(得分:0)
由于按钮是addButton
的本地按钮,因此您需要引用它。从addButton
方法返回按钮的引用并使用它。
以这种方式使用它会更好
public Button addButton(){
//create Button
}
您可以将此按钮添加到StackPane
start()
<强>替代地强>,
不推荐使用此方法。
您可以从StackPane中获取Button
Button button = (Button)root.getChildren().get(0);
N.B。 只有在确定按钮的位置
时才使用此功能如果您只想将设计与控件执行的操作分开,JavaFX使用FXML提供了一种方法。
它可以帮助您设计UI而无需放纵他们需要执行的操作。之后,这些FXML可以通过控制器(Java接口)绑定到他们的行为
答案 2 :(得分:0)
将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中进行布局并将控件注入控制器类,该控制器类可以负责事件处理程序。