2016-11-13 8 views
1

Я хочу создать приложение JavaFX для своего клиента. Я нашел структуру DataFX и люблю ее. Но у меня проблема с @FXMLViewFlowContext, потому что он возвращает null каждый раз, когда я вызываю child fview из моего родителя. Я использовал Lib версии 8.0.7 и ниже кодов@FXMLViewFlowContext Исключение нулевого указателя

  1. Я создаю вид сбоку в моем главном контроллере с i18n ресурса:

    // 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. и это с моей стороны контроллера панели

    @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, потому что контекст никогда не вводится. Я искал, но не нашел никакого решения. Также я стараюсь использовать старые библиотеки, но не помогает.

ответ

1

Наконец-то я решил свою проблему. Есть две причины для этой проблемы. 1. Первый связан с DataFX версия библиотеки. 2. Вторая проблема: Инициализировать mehtod. Когда DataFX будет начать создавать контроллер экземпляр класса инициализации метод будет вызываться JavaFX FXMLLoader.load() метод, и это произойдет до инициализации ViewFlowContext так что я получил NullPointerException. Другими словами, если вы используете аннотация @PostConstruct и вызываете свой метод с именем initialize, как и я, ваш метод будет называться два раза один, когда создается экземпляр класса контроллера (контекст еще не инициализирован), а другой - когда будет вызван метод @PostConstruct (контекст создал). Это правильно для DataFX flow lib 8.0b8 версия. Я проверил эту версию lib 8.0.7, но я получил NullPointerException еще раз. Так что я изменил свою версию lib, и теперь все в порядке

+0

Отладка какое-то время, я понял, какова была моя ошибка, а именно, что вы всегда должны регистрировать объекты контекста перед вызовом метода flowHandler.start(). –

+0

Я попытался добавить его перед 'flowHandler.start', как вы, но не работает' context.register ("model", mymodel); 'и также возвращается нулевым – MineIsMine