首页 > 解决方案 > JavaFX - 从不同的场景将数据添加到 TableView

问题描述

我正在尝试捕获从 addItems.java 类输入的 TextField 和 Control Field 值。然后在 shoppingCartController.java 类上生成的 TableView 上显示该数据。当我在 addItems.java 文件上点击 add 时,我没有收到错误消息,但是当我回到主 shoppingCartController 场景时,输入的数据不存在。

以下是选择“添加”按钮时调用的内容:

   public void handleitemAdd(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("additems.fxml"));
        Parent addItem_page = loader.load();

        ObservableList<Products> list = FXCollections.observableArrayList();

        list.add(new Products(productPriority.toString(),
                productName.getText(),
                Double.parseDouble(productPrice.getText()),
                Integer.parseInt(productQty.getText())));
        table.getItems().add(list);

        System.out.println("Displaying information to consoles: Ensuring the addItem method worked as expected.");
    }

对审查此问题的任何帮助将不胜感激。

addItems.java

package shoppingcart;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class addItems implements Initializable {

    // Fields used to add items to cart
    @FXML private TextField productName = new TextField();
    @FXML private TextField productQty = new TextField();
    @FXML private TextField productPrice = new TextField();
    @FXML private ChoiceBox productPriority = new ChoiceBox();

    // Create the TableView
    TableView table = new TableView(shoppingCartController.getProduct());

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        //Used to Initialize the Scene
    }

    public void handleitemAdd(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("additems.fxml"));
        Parent addItem_page = loader.load();

        ObservableList<Products> list = FXCollections.observableArrayList();

        list.add(new Products(productPriority.toString(),
                productName.getText(),
                Double.parseDouble(productPrice.getText()),
                Integer.parseInt(productQty.getText())));
        table.getItems().add(list);

        System.out.println("Displaying information to consoles: Ensuring the addItem method worked as expected.");
    }

    public void handleitemReturnCart(ActionEvent event) throws IOException {

        Parent shoppingCart_page = FXMLLoader.load(getClass().getResource("shoppingcart.fxml"));
        Scene shoppingCart_scene = new Scene(shoppingCart_page);
        Stage shoppingCart_stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        shoppingCart_stage.setScene(shoppingCart_scene);
        shoppingCart_stage.show();

        System.out.println("Displaying information to console: Ensuring that user returned to main page");

    }

}

addItems.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<AnchorPane id="" fx:id="productPage" prefHeight="750.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="shoppingcart.addItems">
    <children>
      <GridPane layoutX="189.0" layoutY="193.0" prefHeight="364.0" prefWidth="399.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints maxHeight="83.0" minHeight="10.0" prefHeight="66.0" vgrow="SOMETIMES" />
          <RowConstraints maxHeight="88.0" minHeight="10.0" prefHeight="88.0" vgrow="SOMETIMES" />
          <RowConstraints maxHeight="76.0" minHeight="10.0" prefHeight="59.0" vgrow="SOMETIMES" />
            <RowConstraints maxHeight="99.0" minHeight="10.0" prefHeight="70.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
              <Text id="" fx:id="labelitemPriority" strokeType="OUTSIDE" strokeWidth="0.0" text="Item Priority:" />
              <ChoiceBox id="" fx:id="productPriority" disable="true" prefWidth="200.0" GridPane.columnIndex="1" />
              <TextField id="" fx:id="productName" prefHeight="14.0" prefWidth="63.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
              <Text id="" fx:id="labelitemName" strokeType="OUTSIDE" strokeWidth="0.0" text="Item Name:" GridPane.rowIndex="1" />
              <TextField id="" fx:id="productQty" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2" />
              <Text id="" fx:id="labelitemQty" strokeType="OUTSIDE" strokeWidth="0.0" text="Item Qty:" GridPane.rowIndex="2" />
              <Text id="" fx:id="labelitemPrice" strokeType="OUTSIDE" strokeWidth="0.0" text="Item Price:" GridPane.rowIndex="3" />
              <TextField id="" fx:id="productPrice" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
              <Button id="itemsAdd" fx:id="productAdd" onAction="#handleitemAdd" prefHeight="37.0" prefWidth="210.0" text="ADD" GridPane.columnIndex="1" GridPane.rowIndex="4" />
         </children>
      </GridPane>
        <Text layoutX="354.0" layoutY="146.0" scaleX="4.085561690303489" scaleY="4.947136563876652" strokeType="OUTSIDE" strokeWidth="0.0" text="Add Items" wrappingWidth="67.541015625">
         <font>
            <Font size="14.0" />
         </font></Text>
        <Button id="returnCartHome" fx:id="productHome" layoutX="288.0" layoutY="609.0" mnemonicParsing="false" onAction="#handleitemReturnCart" prefHeight="48.0" prefWidth="201.0" text="Return to Cart" />
    </children>
</AnchorPane>

购物车控制器.java

package shoppingcart;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class shoppingCartController implements Initializable {

    //Table used for Shopping Cart
    @FXML private TableView<Products> item_Table;
    @FXML private TableColumn<Products, String> item_Priority;
    @FXML private TableColumn<Products, String> item_Name;
    @FXML private TableColumn<Products, Number> item_Qty;
    @FXML private TableColumn<Products, Number> item_Price;

    private ObservableList<Products> productItems;

    //The Initializer used to load data prior to loading view.

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        item_Priority.setCellValueFactory(cellData -> cellData.getValue().itemPriorityProperty());
        item_Name.setCellValueFactory(cellData -> cellData.getValue().itemNameProperty());
        item_Qty.setCellValueFactory(cellData -> cellData.getValue().itemQtyProperty());
        item_Price.setCellValueFactory(cellData -> cellData.getValue().itemPriceProperty());

        //Display all items in table
        item_Table.setItems(getProduct());

    }

    // Method used to get the list of products
    public static ObservableList<Products> getProduct() {

    //Obseravable list which can be used to collect items
    ObservableList<Products> products = FXCollections.observableArrayList();
        return products;
    }

    public void handleitemAddition(ActionEvent event) throws IOException {

        Parent addItem_page = FXMLLoader.load(getClass().getResource("addItems.fxml"));
        Scene addItem_scene = new Scene(addItem_page);
        Stage addItem_stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        addItem_stage.setScene(addItem_scene);
        addItem_stage.show();

        System.out.println("Displaying information to consoles: Deleting Selected Item");
    }
    public void handleitemDelete(ActionEvent event) throws IOException {
        System.out.println("Displaying information to consoles: Deleting Selected Item");
    }
}

购物车.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<AnchorPane prefHeight="750.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="shoppingcart.shoppingCartController">
  <TableView fx:id="item_Table" layoutX="77.0" layoutY="174.0" prefHeight="352.0" prefWidth="646.0" tableMenuButtonVisible="true">
    <columnResizePolicy>
      <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
    </columnResizePolicy>
    <columns>
      <TableColumn fx:id="item_Priority" editable="false" prefWidth="75.0" text="Priority">
        <cellValueFactory>
          <PropertyValueFactory property="itemPriority" />
        </cellValueFactory>
      </TableColumn>
      <TableColumn fx:id="item_Name" editable="false" prefWidth="75.0" text="Item Name">
        <cellValueFactory>
          <PropertyValueFactory property="itemName" />
        </cellValueFactory>
      </TableColumn>
      <TableColumn fx:id="item_Qty" editable="false" prefWidth="75.0" text="Item Qty">
        <cellValueFactory>
          <PropertyValueFactory property="itemQty" />
        </cellValueFactory>
      </TableColumn>
      <TableColumn fx:id="item_Price" editable="false" prefWidth="75.0" text="Item Price">
        <cellValueFactory>
          <PropertyValueFactory property="itemPrice" />
        </cellValueFactory>
      </TableColumn>
    </columns>
  </TableView>
  <Text layoutX="199.0" layoutY="119.0" scaleX="1.4035087719298245" scaleY="1.7005740221599253" strokeType="OUTSIDE" strokeWidth="0.0" text="Shopping Cart Application" wrappingWidth="401.1374694108964">
    <font>
      <Font size="34.0" />
    </font>
  </Text>
  <Button id="itemsDelete" layoutX="501.0" layoutY="571.0" mnemonicParsing="false" onAction="#handleitemDelete" prefHeight="46.0" prefWidth="222.0" text="Delete Selected" />
  <Button fx:id="itemsAdd" layoutX="77.0" layoutY="571.0" onAction="#handleitemAddition" prefHeight="46.0" prefWidth="222.0" text="Add Items" />
</AnchorPane>

编辑:

感谢您的帮助,我仍在学习 Java 并有一个后续问题。

我更新了 addItems.java 以包括:

public void handleitemAdd(ActionEvent event) throws IOException {

    products.add(new Products(productPriority.toString(),
            productName.getText(),
            Double.parseDouble(productPrice.getText()),
            Integer.parseInt(productQty.getText())));

    System.out.println("Displaying information to consoles: Ensuring the addItem method worked as expected.");
}

以及 shoppingCartController 包括:

public void setTableItems(ObservableList<Products> products) throws IOException {

    FXMLLoader loader = new FXMLLoader(getClass().getResource("shoppingcart.fxml"));
    Scene shoppingCart_scene = new Scene(loader.load());
    shoppingCartController controller =  loader.getController();
    controller.setTableItems(products);
}

但是该值仍然没有结转,我还确保正在捕获参数(使用调试模式确认)。

标签: javajavafx

解决方案


正如@Kleopatra 在评论中所说,静态访问有时会很棘手,所以要小心并坚持 Java 通用命名约定,您的代码很难追踪

,您可以通过ShoppingCart控制器设置列表将项目返回给它

    FXMLLoader loader = new FXMLLoader(getClass().getResource("shoppingcart.fxml"));
    Scene shoppingCart_scene = new Scene(loader.load());
    shoppingCartController controller =  loader.getController();
    controller.setProducts(list);

setProduct()函数中,您可以更新表格,
或者
您可以ObservableList在静态函数之外创建,但我不建议这样做,我建议您搜索有关在 javafx 中的控制器之间传递数据的信息,请参阅下面的链接 https://stackoverflow.com/a/ 14190310/5303683


推荐阅读