我想为我的客户创建一个 JavaFX 应用程序。我发现了 DataFX 框架并且喜欢它。但是我对 @FXMLViewFlowContext
有问题,因为每次我从父级调用子 fview 时它都会返回 null
。我使用lib版本8.0.7及以下代码
我使用 i18n 资源在主 Controller 中创建侧 View :
// side controller will add links to the content flow Flow sideMenuFlow = new Flow(SideMenuController.class); sideMenuFlowHandler = new FlowHandler(sideMenuFlow, context, Common.getViewConfiguration()); drawer.setSidePane(sideMenuFlowHandler.start(new AnimatedFlowContainer(Duration.millis(320), ContainerAnimations.SWIPE_LEFT)));
这是我的侧 Pane Controller
@FXMLController(value = "/res/fxml/test.fxml") public class SideMenuController { @FXMLViewFlowContext private ViewFlowContext context; @FXML private JFXListView test; @FXML @ActionTrigger("suppliers") private JFXButton suppliers; @FXML @ActionTrigger("history") private JFXButton history; @FXML @ActionTrigger("barcode") private JFXButton barcode; @FXML @ActionTrigger("settings") private JFXButton settings; @FXML @ActionTrigger("report") private JFXButton report; @FXML @ActionTrigger("users") private JFXButton users; @FXML @ActionTrigger("inventory") private JFXButton inventory; @FXML @ActionTrigger("shops") private JFXButton shops; @FXML @ActionTrigger("calculation") private JFXButton calculation; @PostConstruct public void initialize(){ test.propagateMouseEventsToParent(); System.out.println(context); FlowHandler contentFlowHandler = (FlowHandler) context.getRegisteredObject("ContentFlowHandler"); Flow contentFlow = (Flow) context.getRegisteredObject("ContentFlow"); bindNodeToController(suppliers, SuppliersController.class, contentFlow, contentFlowHandler); bindNodeToController(inventory, InventoryController.class, contentFlow, contentFlowHandler); bindNodeToController(users, UsersController.class, contentFlow, contentFlowHandler); bindNodeToController(history, HistoryController.class, contentFlow, contentFlowHandler); bindNodeToController(shops, ShopsController.class, contentFlow, contentFlowHandler); bindNodeToController(report, ReportController.class, contentFlow, contentFlowHandler); bindNodeToController(barcode, BarcodeController.class, contentFlow, contentFlowHandler); bindNodeToController(calculation, CalculationController.class, contentFlow, contentFlowHandler); bindNodeToController(settings, SettingsController.class, contentFlow, contentFlowHandler); } private void bindNodeToController(Node node, Class<?> controllerClass, Flow flow, FlowHandler flowHandler) { flow.withGlobalLink(node.getId(), controllerClass); node.setOnMouseClicked((e) -> { try { flowHandler.handle(node.getId()); } catch (Exception e1) { e1.printStackTrace(); } }); } }
当我运行程序时,我收到一个 NullPointerException
因为上下文从未被注入(inject)。我搜索但没有找到任何解决方案。我也尝试旧的库,但没有帮助。
最佳答案
终于解决了我的问题。造成这个问题的原因有两个。 1. 第一个与DataFX库版本有关。 2. 第二个问题是初始化方法。当DataFX开始创建 Controller 类实例时initialize方法将被javafxFXMLLoader.load()方法调用,并且这发生在init之前>ViewFlowContext,这样我就得到了NullPointerException。换句话说,如果您使用 @PostConstruct 注释并使用名称 initialize 调用您的方法,就像我一样,您的方法将被调用两次,一次是在创建新的 Controller 类实例时(上下文尚未初始化),另一个是当调用 @PostConstruct 方法时(上下文已创建)。这对于 DataFX flow lib 8.0b8 版本是正确的。我检查了这个版本lib 8.0.7,但我再次得到NullPointerException。所以我改变了我的lib版本,现在一切都好
关于java - @FXMLViewFlowContext 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571855/