在initialize()方法中调用onAction(ActionEvent event)方法时,我在javafx中遇到问题。
这是javafx代码:
public class MainViewController implements Initializable {
@FXML
private Label lblHeading;
@Override
public void initialize(URL url, ResourceBundle rb) {
btnLoginUserOnAction(null);
}
@FXML
private void btnLoginUserOnAction(ActionEvent event) {
String getId = ((Button) event.getSource()).getText();
lblHeading.setText(getId);
}
}
我如何用
btnLoginUserOnAction(ActionEvent event)
称呼 initialize(URL url, ResourceBundle rb)
。如果我将 null
传递给 ActionEvent
参数,那么我会显示 execption
,因为 Event
我们 null
。
有什么帮助吗???
在探索该问题并考虑其他用户提供的评论后,以下是解决方案和解释:
在 JavaFX 中,如果您尝试从事件中检索信息(例如源按钮),则
ActionEvent
方法中的 onAction
参数不能为 null
。如果您使用 null
调用该方法,尝试访问 event.getSource()
将导致 NullPointerException
。
出现此问题的原因是您希望以编程方式触发
onAction
方法中定义的相同逻辑,但无需用户交互。
除了直接调用
btnLoginUserOnAction(null)
方法之外,你还可以通过两种专业的方式来实现:
首选方法:使用
button.fire()
如果您有权访问 Button
(通过 @FXML
注入或 lookup
),则 fire()
方法是模拟按钮单击的最简洁方法。它以编程方式触发 onAction
处理程序。
@FXML
private Button btnLoginUser; // Inject the button
@Override
public void initialize(URL url, ResourceBundle rb) {
// Simulate a button click
btnLoginUser.fire();
}
@FXML
private void btnLoginUserOnAction(ActionEvent event) {
String getId = ((Button) event.getSource()).getText();
lblHeading.setText(getId);
}
替代方案:手动创建并传递
ActionEvent
如果按钮引用不能直接使用,您可以创建一个 ActionEvent
并将其传递给该方法。确保设置正确的源以避免运行时错误。
@FXML
private Button btnLoginUser;
@Override
public void initialize(URL url, ResourceBundle rb) {
// Manually create an ActionEvent
ActionEvent event = new ActionEvent(btnLoginUser, null);
btnLoginUserOnAction(event);
}
@FXML
private void btnLoginUserOnAction(ActionEvent event) {
if (event == null || event.getSource() == null) {
System.out.println("ActionEvent or its source is null!");
return;
}
String getId = ((Button) event.getSource()).getText();
lblHeading.setText(getId);
}
感谢指导解决方案的富有洞察力的评论:
ActionEvent
需要访问按钮,并且在场景图中导航按钮并不理想。Button.fire()
——它是针对此用例而设计的,干净且高效。null
传递给需要事件的方法,除非您已明确处理 null
场景。我希望这个解释和解决方案可以帮助其他面临类似问题的人。再次感谢社区提供的宝贵见解!