java - @FXMLViewFlowContext 空指针异常

标签 java javafx control-flow viewflow

我想为我的客户创建一个 JavaFX 应用程序。我发现了 DataFX 框架并且喜欢它。但是我对 @FXMLViewFlowContext 有问题,因为每次我从父级调用子 fview 时它都会返回 null 。我使用lib版本8.0.7及以下代码

  1. 我使用 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)));
    
  2. 这是我的侧 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/

相关文章:

java - 排序数组: Bubble sort

mysql - 如何使用 MySQL 有条件 SELECT 多列?

While 循环中的 Python Walrus 运算符

c++ - 减少 if-elseif 语句的聪明方法

java - 未使用 Selenium Web 驱动程序捕获数据

java - 尝试在工厂 org.apache.poi.xssf.usermodel.XSSFWorkbookFactory 和参数上调用 'createWorkbook' 时

java - 在 lucene-core.jar 之前运行 `SolrTestCaseJ4` 测试 : Fix your classpath to have tests-framework. jar 时出现断言错误

javafx - 如何在 FXML 中的对象元素之前创建对对象的引用?

JavaFX 在 JavaFX StringBinding 中将逗号 (,) 替换为点 (.)

JavaFX 如何通过按钮从 TableView 中获取特定列的所有值和总和?