javafx 将数据发送回先前的控制器
javafx send back data to previous controller
我有两个不同的控制器和两个不同的 FXML 视图。
第一个控制器是 CashierController,里面有一个按钮可以打开新场景和新控制器 AddProductController。在此 cashiercontroller 中,购物车要初始化以根据购物车项目填充 table 视图。
Second, open Addproductcontroller when click that button with new scene while prev cashiercontroller still open.inside AddProductController have the gridpane,when choose any cell inside the gridpane will add the product to cart.
问题是购物车没有更新,我无法使用它来刷新列表并重建 table 因为 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());
}
}
将产品添加到购物车是在网格窗格内单击。我尝试使用静态实例,但在 null 异常中出错。提前致谢。
改变
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.show();
到
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
"showAndWait" 命令后列出的所有代码将在 运行 之前等待对话框关闭。所以基本上你可以为你的 AddProductController 返回的任何数据放置一个 public getter 方法,并在 stage.showAndWait
之后在主 CashierController 中调用它
像这样
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
Product product = addProductControllerController.getScannedProduct();
我有两个不同的控制器和两个不同的 FXML 视图。 第一个控制器是 CashierController,里面有一个按钮可以打开新场景和新控制器 AddProductController。在此 cashiercontroller 中,购物车要初始化以根据购物车项目填充 table 视图。
Second, open Addproductcontroller when click that button with new scene while prev cashiercontroller still open.inside AddProductController have the gridpane,when choose any cell inside the gridpane will add the product to cart.
问题是购物车没有更新,我无法使用它来刷新列表并重建 table 因为 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());
}
}
将产品添加到购物车是在网格窗格内单击。我尝试使用静态实例,但在 null 异常中出错。提前致谢。
改变
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.show();
到
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
"showAndWait" 命令后列出的所有代码将在 运行 之前等待对话框关闭。所以基本上你可以为你的 AddProductController 返回的任何数据放置一个 public getter 方法,并在 stage.showAndWait
之后在主 CashierController 中调用它像这样
AddProductController addProductControllerController = fxmlLoader.getController();
fxmlLoader.setController(addProductControllerController);
stage.showAndWait();
Product product = addProductControllerController.getScannedProduct();