JavaFX向HBox添加按钮时报buttonBox为null空指针错误求助
问题根源
你遇到的空指针问题本质是@FXML注解标注的字段没有被正确注入,原因符合两个场景之一:
- 你调用
addWhereToButtons方法的View实例,不是FXMLLoader加载FXML文件时绑定的控制器实例:只有和FXML绑定的控制器实例,在FXML加载完成后@FXML标注的组件才会被赋值,你自行new出来的View实例里的buttonBox永远是null。 - 调用
addWhereToButtons的时机早于FXML加载完成:FXML未加载完毕时,哪怕是绑定的控制器实例,buttonBox也还没完成注入。
你手动新建HBox添加按钮不显示,是因为新建的HBox没有被加入当前显示的场景图中,未被JavaFX渲染引擎识别自然不会展示。
解决方案
方案1:将当前View实例设置为FXML控制器
如果你的FXML文件根节点没有配置fx:controller属性,直接修改start方法,提前给FXMLLoader设置控制器为当前实例即可:
public void start() { try { FXMLLoader fxmlLoader = new FXMLLoader(SimpleMaps.class.getResource(INTERFACE_LOCATION)); // 新增这行,将当前实例设为FXML的控制器,@FXML字段会注入到当前实例中 fxmlLoader.setController(this); Parent anchorPane = fxmlLoader.load(); SimpleMaps.mainStage.setScene(new Scene(anchorPane)); SimpleMaps.mainStage.show(); } catch(IOException e) { e.printStackTrace(); System.exit(1); } }
之后保证先调用start方法完成FXML加载,再调用addWhereToButtons方法即可。
方案2:从FXMLLoader获取绑定的控制器实例
如果你的FXML文件已经配置了fx:controller="com.example.simplemaps.View",不要自行new View实例,加载FXML后从loader中拿到绑定的控制器实例再调用方法即可:
首先修改View的加载逻辑:
// 改为静态方法,返回加载完成后的控制器实例 public static View initAndShowView() { try { FXMLLoader fxmlLoader = new FXMLLoader(SimpleMaps.class.getResource(INTERFACE_LOCATION)); Parent anchorPane = fxmlLoader.load(); // 获取FXML绑定的控制器实例 View controller = fxmlLoader.getController(); SimpleMaps.mainStage.setScene(new Scene(anchorPane)); SimpleMaps.mainStage.show(); return controller; } catch(IOException e) { e.printStackTrace(); System.exit(1); return null; } }
然后在你调用addWhereToButtons的位置,先调用initAndShowView拿到正确的View实例,再调用方法:
View view = View.initAndShowView(); view.addWhereToButtons("测试出口");
内容的提问来源于stack exchange,提问作者u.dp
相关产品推荐
相关产品推荐

