javafx将数据发送回上一个控制器

javafx将数据发送回上一个控制器,java,javafx,fxml,Java,Javafx,Fxml,我有两个不同的控制器和两个不同的FXML视图。 第一个控制器是出纳控制器,里面有一个按钮,可以打开新的场景并使用新的控制器AddProductController。在此出纳控制器中,要初始化购物车以基于购物车项目填充tableview 第二,当在新场景中单击该按钮时打开Addproductcontroller,而prev cashiercontroller仍处于打开状态。在Addproductcontroller中,如果选择gridpane中的任何单元格,则会将产品添加到购物车中 问题是购物车未

我有两个不同的控制器和两个不同的FXML视图。 第一个控制器是出纳控制器,里面有一个按钮,可以打开新的场景并使用新的控制器AddProductController。在此出纳控制器中,要初始化购物车以基于购物车项目填充tableview

第二,当在新场景中单击该按钮时打开Addproductcontroller,而prev cashiercontroller仍处于打开状态。在Addproductcontroller中,如果选择gridpane中的任何单元格,则会将产品添加到购物车中

问题是购物车未更新,我无法使用刷新列表和重建表,因为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;
                    });

        }
    }
公共类出纳控制器实现可初始化{
公共按钮btnAdd;
公共jfx按钮btnExit;
公共桌面视图桌面视图;
公共表列数量;
公共表列colName;
公共价格;
公共JFXTextField txtBarcode;
@FXML
自有品牌lblAmount;
@FXML
自有品牌lblInfo;
手推车;
ProductModel ProductModel;
//私有出纳控制器(){}
//
公共静态出纳控制器getInstance(){
返回CashierControllerHolder.INSTANCE;
}
私有静态类出纳控制器{
私有静态最终出纳控制器实例=新出纳控制器();
}
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
productModel=新productModel();
购物车=新购物车();
}
public void calculateView(){
lblSubtotal.setText(cart.getSubTotal().toString());
lblTax.setText(cart.getChargesTax().toString());
lblTotal.setText(cart.getTotal().toString());
}
公共空刷新列表(){
ObservableList items=FXCollections.observableArrayList(cart.getItemList());
可设置单元();
tableView.setItems(项目);
}
公共无效addToCart(产品){
添加(product.getId(),product.getBarcode(),product.getName(),1,product.getPrice_sell());
}
public void addProductAction(ActionEvent ActionEvent){
试一试{
FXMLLoader FXMLLoader=新的FXMLLoader(getClass().getResource(“/views/subview/addProduct.fxml”);
父root1=(父)fxmlLoader.load();
阶段=新阶段();
舞台场景(新场景(root1));
AddProductController addProductControllerController=fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.show();
}捕获(IOE异常){
e、 printStackTrace();
}
}
public void setCellTable(){
colQty.setCellValueFactory(新属性ValueFactory(“数量”);
colName.setCellValueFactory(新属性ValueFactory(“名称”);
colPrice.setCellValueFactory(
手机数据->{
SimpleStringProperty=新SimpleStringProperty();
set(df1.format(cellData.getValue().getTotal());
归还财产;
});
}
}
这是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());
    }


}
公共类AddProductController实现可初始化的ProductInterface{
@FXML
公共标签;
@FXML
公共边界窗格边界窗格所有;
公共jfx按钮btnExit;
private GridPane GridPane=new GridPane();
私人产品模型;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
productModel=新productModel();
loadData();
标签[]标签=新标签[PRODUCTLIST.size()];
Label[]labelBarcode=新标签[PRODUCTLIST.size()];
标签[]labelPrice=新标签[PRODUCTLIST.size()];
VBox vBoxes[]=新的VBox[4];
int cols=2,colCnt=0,rowCnt=0;
用于(int i=0;icols){
rowCnt++;
colCnt=0;
}
}
边界窗格所有设置中心(网格窗格);
addGridEvent();
}
私有void addGridEvent(){
gridPane.getChildren().forEach(项->{
setOnMouseClicked(新的EventHandler(){
字符串名称=null;
字符串条形码=空;
BigDecimal价格=新的BigDecimal(0.00);
List t=new ArrayList();
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getClickCount()==2){
如果(VBox的项目实例){
对于(Node nodeIn:((VBox)项).getChildren()){
if(nodeIn instanceof标签){
t、 添加(((标签)nodeIn.getText());
}
}
}
name=t.get(0);
条形码=t.get(1);
价格=新的大十进制(t.get(2));
Product Product=productModel.getProductByBarcode(条形码);
//将产品添加到购物车
CashierController.getInstance().addToCart(产品);
//刷新列表
//计算价值
//CashierController.getInstance().refreshList();
//CashierController.getInstance().calculateView();
}
如果(event.isPrimary
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.show();
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
Product product = addProductControllerController.getScannedProduct();