У меня два разных контроллера с двумя разными видами 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());
}
}
Добавить товар в корзину был клик внутри панели сетки.Я пытаюсь использовать статический экземпляр, но ошибка в нулевом исключении.Спасибо заранее.