如何在javafx中调用onAction(ActionEvent event)方法

问题描述 投票:0回答:1

在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

有什么帮助吗???

java events javafx event-handling javafx-8
1个回答
0
投票

在探索该问题并考虑其他用户提供的评论后,以下是解决方案和解释:


问题:

在 JavaFX 中,如果您尝试从事件中检索信息(例如源按钮),则

ActionEvent
方法中的
onAction
参数不能为
null
。如果您使用
null
调用该方法,尝试访问
event.getSource()
将导致
NullPointerException

出现此问题的原因是您希望以编程方式触发

onAction
方法中定义的相同逻辑,但无需用户交互。


解决方案:

除了直接调用

btnLoginUserOnAction(null)
方法之外,你还可以通过两种专业的方式来实现:

  1. 首选方法:使用

    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);
    }
    
  2. 替代方案:手动创建并传递

    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);
    }
    

致谢:

感谢指导解决方案的富有洞察力的评论:

  1. @kleopatra:建议重点关注按钮在 JavaFX 中的工作方式以及学习最佳实践的重要性。
  2. @fabian:强调手动创建
    ActionEvent
    需要访问按钮,并且在场景图中导航按钮并不理想。
  3. @SaiDandem:询问按钮是预定义的还是动态加载的,有助于澄清问题。

要点:

  • 尽可能使用
    Button.fire()
    ——它是针对此用例而设计的,干净且高效。
  • 避免将
    null
    传递给需要事件的方法,除非您已明确处理
    null
    场景。
  • 始终设计您的 JavaFX 应用程序以遵循最佳实践,确保可读性和可维护性。

我希望这个解释和解决方案可以帮助其他面临类似问题的人。再次感谢社区提供的宝贵见解!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.