1

クライアント用の JavaFX アプリケーションを作成したいと考えています。DataFX フレームワークを見つけて気に入りました。しかし、親から子 fview を呼び出すたび@FXMLViewFlowContextに返されるため、問題があります。nulllibバージョン8.0.7以下のコードを使用しました

  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と、コンテキストが挿入されないため、エラーが発生します。検索しましたが、解決策が見つかりませんでした。また、古いライブラリを試してみましたが、役に立ちません。

4

1 に答える 1

2

最後に私は私の問題を解決しました。この問題には 2 つの理由があります。1. 最初のものは、DataFXライブラリのバージョンに関連しています。2. 2 つ目の問題は、メソッドの初期化です。DataFXがコントローラ クラス インスタンスの作成を開始すると、javafx FXMLLoader.load()メソッドによって初期化メソッドが呼び出され、これが ViewFlowContext初期化の前に発生するためNullPointerExceptionが発生します。つまり、 @PostConstructアノテーションを使用して、私のようにinitializeという名前でメソッドを呼び出すと、メソッドは 2 回呼び出されます。@PostConstructメソッドが呼び出されます (コンテキストが作成されます)。これは、DataFX フロー ライブラリ 8.0b8バージョンに対応しています。このバージョンの lib 8.0.7を確認しましたが、NullPointerExceptionが再び発生します。libバージョンを変更したので、すべて問題ありません

于 2016-11-13T12:48:51.067 に答える