我正在创建一个库存管理系统,并尝试从选定的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);
}
这还没有完成,但是你明白了,谢谢!
答案 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()函数。
完成此设置后,您可以通过以下方式调用标签内容和控制器:
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文件和控制器的加载器。