javafx отправляет данные обратно на предыдущий контроллер - PullRequest
0 голосов
/ 06 июня 2018

У меня два разных контроллера с двумя разными видами FXML.Первый контроллер - CashierController, внутри есть кнопка для открытия новой сцены и с новым контроллером AddProductController.В этом кассовом контроллере была инициализирована корзина, чтобы заполнить табличное представление, основанное на элементе корзины.

Во-вторых, откройте Addproductcontroller, когда нажмите эту кнопку с новой сценой, в то время как предыдущий cashiercontroller все еще открыт.внутри сетки добавит товар в корзину.

Проблема заключалась в том, что корзина не обновлялась, и я не могу использовать ее, чтобы обновить список и перестроить таблицу, так как метод в CashierController.Как я хочу передать данные к предыдущему контроллеру, который все еще открыт, в то время как я все еще в текущем состоянии (addproductController). Как передать между контроллером 2, чтобы получить назад или или прослушать событие от новой до предыдущей сцены.

    public class CashierController implements Initializable {

        public Button btnAdd;
        public JFXButton btnExit;
        public TableView<Item> tableView;
        public TableColumn<Item, String> colQty;
        public TableColumn<Item, String> colName;
        public TableColumn<Item, String> colPrice;
        public JFXTextField txtBarcode;

        @FXML
        private Label lblAmount;
        @FXML
        private Label lblInfo;

        Cart cart;

        ProductModel productModel;

    //    private CashierController (){}
    //
        public static CashierController getInstance(){
            return CashierControllerHolder.INSTANCE;
        }

        private static class CashierControllerHolder {
            private static final CashierController INSTANCE = new CashierController();
        }

        @Override
        public void initialize(URL location, ResourceBundle resources) {

            productModel = new ProductModel();
            cart = new Cart();  
        }

        public void calculateView() {
            lblSubtotal.setText(cart.getSubTotal().toString());
            lblTax.setText(cart.getChargesTax().toString());
            lblTotal.setText(cart.getTotal().toString());
        }

        public void refreshList() {
            ObservableList<Item> items = FXCollections.observableArrayList(cart.getItemList());
setCellTable();
            tableView.setItems(items);
        }

        public void addToCart(Product product) {
            cart.add(product.getId(), product.getBarcode(),product.getName(), 1, product.getPrice_sell());
        }

        public void addProductAction(ActionEvent actionEvent) {
            try {
                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/subview/addProduct.fxml"));
                Parent root1 = (Parent) fxmlLoader.load();
                Stage stage = new Stage();
                stage.setScene(new Scene(root1));
                AddProductController addProductControllerController = fxmlLoader.getController();
                fxmlLoader.setController(addProductControllerController);
                stage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        public void setCellTable(){

            colQty.setCellValueFactory(new PropertyValueFactory<>("quantity"));
            colName.setCellValueFactory(new PropertyValueFactory<>("name"));
            colPrice.setCellValueFactory(
                    cellData ->{
                        SimpleStringProperty property = new SimpleStringProperty();
                        property.set(df1.format(cellData.getValue().getTotal()));
                        return property;
                    });

        }
    }

это AddProducController

    public class AddProductController implements Initializable , ProductInterface {

    @FXML
    public Tab tabAll;
    @FXML
    public BorderPane borderPaneAll;
    public JFXButton btnExit;

    private GridPane gridPane = new GridPane();
    private ProductModel productModel;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        productModel = new ProductModel();
        loadData();

        Label[] label = new Label[PRODUCTLIST.size()];
        Label[] labelBarcode = new Label[PRODUCTLIST.size()];
        Label[] labelPrice = new Label[PRODUCTLIST.size()];
        VBox vBoxes[] = new VBox[4];

        int cols=2, colCnt = 0, rowCnt = 0;
        for (int i=0; i<PRODUCTLIST.size(); i++) {

            label[i] = new Label();
            labelBarcode[i] = new Label();
            labelPrice[i] = new Label();

            label[i].setText(PRODUCTLIST.get(i).getName());
            labelBarcode[i].setText(PRODUCTLIST.get(i).getBarcode());
            labelPrice[i].setText(String.valueOf(PRODUCTLIST.get(i).getPrice_sell()));

            vBoxes[i] = new VBox(5);
            vBoxes[i].getChildren().addAll(label[i],labelBarcode[i], labelPrice[i]);

            gridPane.add(vBoxes[i], colCnt, rowCnt);
            gridPane.setHgap(20);
            gridPane.setVgap(20);
            colCnt++;
            if (colCnt>cols) {
                rowCnt++;
                colCnt=0;
            }
        }
        borderPaneAll.setCenter(gridPane);

        addGridEvent();

    }


    private void addGridEvent() {
        gridPane.getChildren().forEach(item -> {
            item.setOnMouseClicked(new EventHandler<MouseEvent>() {
                String name = null;
                String barcode = null;
                BigDecimal price = new BigDecimal(0.00);
                List<String> t = new ArrayList<>();
                @Override
                public void handle(MouseEvent event) {
                    if (event.getClickCount() == 2) {
                        if(item instanceof VBox){
                            for(Node nodeIn: ((VBox) item).getChildren()){

                                if(nodeIn instanceof Label){
                                    t.add(((Label)nodeIn).getText());
                                }
                            }
                        }

                        name = t.get(0);
                        barcode = t.get(1);
                        price = new BigDecimal(t.get(2));

                        Product product = productModel.getProductByBarcode(barcode);
                        //add product to cart
                        CashierController.getInstance().addToCart(product);
                        //refreshthelist
                        //calculatethevalue

//                        CashierController.getInstance().refreshList();
//                        CashierController.getInstance().calculateView();

                    }
                    if (event.isPrimaryButtonDown()) {
                        System.out.println("PrimaryKey event");
                    }

                }
            });

        });


    }

    private void loadData(){
        if (!PRODUCTLIST.isEmpty()) {
            PRODUCTLIST.clear();
        }
        PRODUCTLIST.addAll(productModel.getProducts());
    }


}

Добавить товар в корзину был клик внутри панели сетки.Я пытаюсь использовать статический экземпляр, но ошибка в нулевом исключении.Спасибо заранее.

1 Ответ

0 голосов
/ 06 июня 2018

Изменить

AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.show();

на

AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();

Весь код, указанный после команды "showAndWait", будет ожидать закрытия диалогового окна перед запуском.По сути, вы можете разместить публичный метод получения для любых данных, которые возвращает ваш AddProductController, и вызвать их в главном CashierController после stage.showAndWait

Примерно так:

AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
Product product = addProductControllerController.getScannedProduct();
...