Java 变量值显示为null
变量Java 变量值显示为null,java,interface,Java,Interface,变量RecurserName被分配了一个由另一个控制器传递的值。但是初始化之后,当BtnClicked方法内部打印recursername时,它会打印null。为什么? public class nextSceneController implements Initializable { private String recUsername; public void transferMessage(String message){ recUsername = me
RecurserName
被分配了一个由另一个控制器传递的值。但是初始化之后,当BtnClicked
方法内部打印recursername
时,它会打印null
。为什么?
public class nextSceneController implements Initializable {
private String recUsername;
public void transferMessage(String message){
recUsername = message;
}
@FXML
private Button Btn;
@FXML
void BtnClicked(ActionEvent event) {
System.out.println(recUsername);
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println(recUsername);
}
}
这是链接到menu.fxml的MenuController.java
public class MenuController {
public MenuController() throws SQLException, ClassNotFoundException {
}
String orderRefNo = Key_Generator.getReferenceKey();
FXMLLoader loader = new FXMLLoader(getClass().getResource("orderList.fxml"));
Parent root = loader.load();
OrderListController orderListController = loader.getController();
orderListController.transferMessage(orderRefNo);
Stage orderListStage = new Stage();
orderListStage.setScene(new Scene(root));
orderListStage.show();
}
这是链接到orderList.fxml的OrderListController
public class OrderListController implements Initializable {
public OrderListController() throws SQLException, ClassNotFoundException, IOException {
}
private String orderRefNoRec;
public void transferMessage(String message){
orderRefNoRec = message;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
try{
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `FoodName`, `Quantity`, `Price` FROM `orders` WHERE OrderRefNo='"+orderRefNoRec+"'");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
observableList.add(new orderListTableModel(resultSet.getString("FoodName"), resultSet.getString("Quantity"),
resultSet.getString("Price")));
}
} catch (SQLException e) {
e.printStackTrace();
}
food_OrderListTableModel.setCellValueFactory(new PropertyValueFactory<>("foodName"));
quantity_OrderListTableModel.setCellValueFactory(new PropertyValueFactory<>("qty"));
price_OrderListTableModel.setCellValueFactory(new PropertyValueFactory<>("price"));
orderListTableModel.setItems(null);
orderListTableModel.setItems(observableList);
}
}
公共类OrderListController实现可初始化{
public OrderListController()引发SQLException、ClassNotFoundException、IOException{
}
私有字符串orderRefNoRec;
公共消息(字符串消息){
orderRefNoRec=消息;
}
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
试一试{
PreparedStatement PreparedStatement=connection.prepareStatement(“从'orders'中选择'FoodName','Quantity','Price',其中OrderRefNo='“+orderRefNoRec+”);
ResultSet ResultSet=preparedStatement.executeQuery();
while(resultSet.next()){
observableList.add(新的orderListTableModel(resultSet.getString(“FoodName”)、resultSet.getString(“Quantity”),
结果集.getString(“价格”);
}
}捕获(SQLE异常){
e、 printStackTrace();
}
food_OrderListTableModel.setCellValueFactory(新属性ValueFactory(“foodName”));
数量\u OrderListTableModel.setCellValueFactory(新属性ValueFactory(“数量”);
price_OrderListTableModel.setCellValueFactory(新属性ValueFactory(“价格”));
orderListTableModel.setItems(空);
orderListTableModel.setItems(observableList);
}
}
在这种情况下,您需要说明您的程序流程,以了解何时可以调用设置变量
下面是一个可能出错的示例(我无法确定,因为我无法访问完整的代码,但这是对最可能出现的问题的过度简化):
- 主场景控制器将创建一个新的nextScene李>
- 然后,业务逻辑调用initialize传递所有必要的资源等李>
- 您在此处调用print,但此时尚未调用
,因此transferMessage
变量仍然为空李>recursermessage
- 然后,您可能会调用
,这将设置变量,但打印永远不会被调用transferMessage
当你将来遇到这样的问题时,如果某件事情没有做你认为它应该做的事情,就把它拉出来,一步一步地,你认为在pin上发生了什么事情,事情应该发生在哪里,你的期望应该调整到哪里。在TransferMessage之前调用initialize。你能分享调用这些方法的代码吗?我怀疑Byte仓鼠是正确的。是的,我认为他是正确的。顺便说一句,你问的是什么代码。@Byte仓鼠嗨,有没有办法在初始化时获取变量值。嗨,谢谢你详细地分享你的知识。我的主要目的是在我的应用程序中,我必须在控制器中填充tableview。tableview使用sql从DB获取数据,对于sql,我必须提供一个变量字符串值,该值在前一个场景控制器中生成并传递到此控制器。任何其他方法都将不胜感激。谢谢。你需要发布你是如何创建这个nextSceneController代码的,这样我才能对此有所帮助。“上一个控制器”。嗨,我用我的主程序编辑了这个问题。请复习一下。谢谢