如何将数据库查询中的参数传递到另一个FXML选项卡中的新FXML?

时间:2016-03-13 21:31:11

标签: sql javafx tabs controller fxml

我正在创建一个库存管理系统,并尝试从选定的tableView行查询数据库,并使用从数据库中检索到的信息填充新选项卡,并使用新的fxml和控制器加载。我找到了创建一个新舞台和场景的答案,现在工作正常: Passing Parameters JavaFX FXML但我不知道如何让它显示在我已经打开的fxml文件的选项卡中。下面是我的代码,当我试图在选项卡中加载数据时,有一些信息被注释掉(我意识到我在加载它时创建了一个fxml控制器的新实例,所以它返回空指针例外,因为虽然我有数据但它没有加载到控制器的新实例中。我的代码是:

state = departmentCB.getValue();
                    if (state.equals(aseptic)) {

                        ResultSet rs = null;
                        PreparedStatement selectedItemStmt = null;
                        Connection con = null;
                        try {
                            con = dBC.getDBConnection();
                            String selectedPart = tableView.getSelectionModel().getSelectedItem().getModel_number();
                            String sql = "select * from aseptic_parts_list where model_number = ?";

                            selectedItemStmt = con.prepareStatement(sql); // create a statement
                            selectedItemStmt.setString(1, selectedPart); // set input parameter
                            rs = selectedItemStmt.executeQuery();
                            System.out.println(rs);
                            // extract data from the ResultSet
                            while (rs.next()) {
                                id = rs.getInt(1);
                                manufacturer_name = rs.getString(2);
                                model_number = rs.getString(3);
                                vendor_name = rs.getString(4);
                                vendor_part_number = rs.getString(5);
                                tolmar_part_number = rs.getString(6);
                                part_location = rs.getString(7);
                                price = rs.getDouble(8);
                                quantity = rs.getInt(9);
                                min = rs.getInt(10);
                                max = rs.getInt(11);
                                img = rs.getString(12);
                                equipment_group = rs.getString(13);
                                equipment_id = rs.getString(14);
                                additional_notes = rs.getString(15);
                                description = rs.getString(16);

                                ItemController ic = new ItemController();

                                ///ic.setTextItems(id, manufacturer_name, model_number, vendor_name, vendor_part_number, tolmar_part_number, part_location, price, quantity, 
                                //      min, max, img, equipment_group, equipment_id, additional_notes, description);
                                //ic.descriptionLbl.setText(description);
                                Tab tab = new Tab();
                                tabs.getTabs().add(tab);
                                tab.setText(tableView.getSelectionModel().getSelectedItem().getDescription());
                                FXMLLoader loader = new FXMLLoader(
                                        getClass().getResource(
                                          "Item.fxml"
                                        )
                                      );

                                Stage stage = new Stage(StageStyle.DECORATED);
                                stage.setScene(
                                  new Scene(
                                    (Pane) loader.load()
                                  )
                                );

                                ItemController controller = 
                                        loader.<ItemController>getController();
                                      controller.setTextItems(id, manufacturer_name, model_number, vendor_name, vendor_part_number, tolmar_part_number, part_location, price, quantity, 
                                                        min, max, img, equipment_group, equipment_id, additional_notes, description);

                                      stage.show();

                                //tab.setContent((Node) FXMLLoader.load(this.getClass().getResource("Item.fxml")));
                                //loader.setController(ic);


                                //ic.descriptionLbl.setText(ic.getDescription());
                                ic.descriptionLbl.setText(description);
                                System.out.println(description + "this works");
                                System.out.println(id + "\t" + manufacturer_name + "\t" + model_number + "\t" + description+ "\t" + equipment_id + "\t" + part_location);


                          }
                        } catch (Exception e) {
                            System.out.println(e);
                          e.printStackTrace();
                        }

                        finally {
                          try {
                            rs.close();
                            selectedItemStmt.close();
                            con.close();
                          } catch (SQLException e) {
                              System.out.println(e);
                            e.printStackTrace();
                          }
                        }
                    } else if (state.equals(general)) {

                    } else if (state.equals(facilities)) {

                    }

                }
            }
        });

请帮助了解如何将这些数据放入新选项卡而不是打开一个新阶段,下面是ItemController的信息,它只是用数据库中检索的特定部分信息更新所有标签:

public void setTextItems (int id, String manufacturer_name, String model_number, String vendor_name, String vendor_part_number, String tolmar_part_number,
                                String part_location, double price, int quantity, int min, int max, String img, String equipment_group, String equipment_id,
                                    String additional_notes, String description) {

    descriptionLbl.setText(description);
    vendorPartNumberLbl.setText(vendor_part_number);
}

这还没有完成,但是你明白了,谢谢!

2 个答案:

答案 0 :(得分:0)

我发现:

tab.setContent((Node) loader.load());

我在传递加载程序之前尝试了这个,但它需要附加load()方法,现在它正在主fxml文档的一个选项卡中加载。

答案 1 :(得分:0)

我不确定这是否是你正在做的事情的正确方式,但务实地说。您需要创建几个类来组织您正在做的事情:

1. Main类应该为主舞台保存你的FXML(F1)加载器并设置Stage

2.此FXML(F1)的Controller类应创建TabPane和Tabs。   该类还应该有一个HashMap来跟踪选项卡的控制器。

3.第3类应该为您的Pane中的内容保留FXML(F2)加载程序,它们也应该将F2控制器设置为对象。以及获取内容的getPane()函数。

  1. F2的Controller类。
  2. 完成此设置后,您可以通过以下方式调用标签内容和控制器:

    public void addTab(ActionEvent event){
      Tab newTab = new Tab();
      F2 f2 = new F2(); // new FXML loader Object
      newTab.setContent(f2.getContent());
      ControllerHash.put('key', f2.getController); // HashMap - binding the content of new Tab with controller
    }
    

    其中一个类应该是FXML文件和控制器的加载器。