将数据从一个场景传递到另一个场景不起作用? (以我对所有其他人的方式进行操作)
Passing data from one scene to another isn't working? (doing it the same way i have for all others)
基本上我试图输入 2 个日期,这些日期将传递给另一个控制器中的 2 个不同的字符串,以便它更改条形图中的文本以便运行报告。
选择2个日期时的代码:
public void okayBtnPressed() throws SQLException, IOException{
con = handler.getConnection();
int count = 0;
String query1 = "SELECT * FROM assigned WHERE Date BETWEEN ? AND ?";
pst = con.prepareStatement(query1);
pst.setString(1, datePickerFrom.getValue().toString());
pst.setString(2, datePickerTo.getValue().toString());
ResultSet rs = pst.executeQuery();
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/bownhrmain1/reports/assignedReport.fxml"));
Parent root = myLoader.load();
AssignedReportController assignedController = myLoader.getController();
while(rs.next()){
count ++;
}
if(count == 0){
// no results
} else {
System.out.println(""+count);
System.out.println(datePickerFrom.getValue().toString());
System.out.println(datePickerTo.getValue().toString());
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.date1 = date1;
assignedController.date2 = date2;
assignedController.amount = count;
Stage window = (Stage)(okayBtn.getScene()).getWindow();
Scene scene = new Scene(root);
window.setScene(scene);
}
}
所有 system.out 行打印正确的日期,在本例中它打印正确的日期并且它 return 是 1 上的行值。
此报表显示在 2 个不同日期之间已分配给员工的项目数。
这是将数据应用于条形图的代码:(这是分配的控制器)
public String date1 = "";
public String date2 = "";
public String totalDate = "";
public int amount;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
totalDate = date1+" - "+date2;
System.out.println(totalDate);
System.out.println(""+amount);
XYChart.Series set1 = new XYChart.Series<>();
set1.getData().add(new XYChart.Data(totalDate, amount));
barChart1.getData().addAll(set1);
}
我没有收到任何错误,但是 assignedController 中的 int 数量是 = 0 并且两个字符串 return 什么都没有。
这是条形图页面的 fxml:
<AnchorPane id="AnchorPane" prefHeight="473.0" prefWidth="737.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="reports.AssignedReportController">
<children>
<BarChart fx:id="barChart1" layoutX="119.0" layoutY="44.0" title="Stock Assigned">
<xAxis>
<CategoryAxis fx:id="monthAxis" label="Month" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis fx:id="amountAxis" label="Amount Sold" side="LEFT" />
</yAxis>
</BarChart>
</children>
</AnchorPane>
控制器中的 initialize()
方法在执行 FXMLLoader.load()
期间被调用,这当然是在您设置控制器中的值之前。您需要在控制器上调用一个方法来更新数据。 (这是一个很好的例子,说明为什么你不应该使用 public 字段 - 它允许更改这些字段而不控制可能依赖于它们的其他字段(在本例中为条形图)发生的情况。)
你需要这样的东西
public class AssignedReportController {
@FXML
private BarChart<String, Number> barchart1 ;
private XYChart.Series<String, Number> set1 ;
public void initialize() {
set1 = new XYChart.Series<>();
barChart1.getData().add(set1);
}
public void setDates(String date1, String date2, int amount) {
String totalDate = date1 + " - " + date2 ;
set1.getData().add(new XYChart.Data<>(totalDate, amount));
}
// ...
}
然后在你的按钮处理程序中你只需要
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.setDates(date1, date2, count);
顺便说一句,您应该考虑为此在 SQL 中使用计数函数,并且您应该关闭不再使用的 JDBC 资源:
public void okayBtnPressed() throws SQLException, IOException{
con = handler.getConnection();
String query1 = "SELECT COUNT(*) FROM assigned WHERE Date BETWEEN ? AND ?";
pst = con.prepareStatement(query1);
pst.setString(1, datePickerFrom.getValue().toString());
pst.setString(2, datePickerTo.getValue().toString());
ResultSet rs = pst.executeQuery();
int count = rs.next().getInt(1);
rs.close();
pst.close();
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/bownhrmain1/reports/assignedReport.fxml"));
Parent root = myLoader.load();
AssignedReportController assignedController = myLoader.getController();
if(count == 0){
// no results
} else {
System.out.println(""+count);
System.out.println(datePickerFrom.getValue().toString());
System.out.println(datePickerTo.getValue().toString());
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.setDates(date1, date2, count);
Stage window = (Stage)(okayBtn.getScene()).getWindow();
Scene scene = new Scene(root);
window.setScene(scene);
}
}
基本上我试图输入 2 个日期,这些日期将传递给另一个控制器中的 2 个不同的字符串,以便它更改条形图中的文本以便运行报告。
选择2个日期时的代码:
public void okayBtnPressed() throws SQLException, IOException{
con = handler.getConnection();
int count = 0;
String query1 = "SELECT * FROM assigned WHERE Date BETWEEN ? AND ?";
pst = con.prepareStatement(query1);
pst.setString(1, datePickerFrom.getValue().toString());
pst.setString(2, datePickerTo.getValue().toString());
ResultSet rs = pst.executeQuery();
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/bownhrmain1/reports/assignedReport.fxml"));
Parent root = myLoader.load();
AssignedReportController assignedController = myLoader.getController();
while(rs.next()){
count ++;
}
if(count == 0){
// no results
} else {
System.out.println(""+count);
System.out.println(datePickerFrom.getValue().toString());
System.out.println(datePickerTo.getValue().toString());
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.date1 = date1;
assignedController.date2 = date2;
assignedController.amount = count;
Stage window = (Stage)(okayBtn.getScene()).getWindow();
Scene scene = new Scene(root);
window.setScene(scene);
}
}
所有 system.out 行打印正确的日期,在本例中它打印正确的日期并且它 return 是 1 上的行值。
此报表显示在 2 个不同日期之间已分配给员工的项目数。
这是将数据应用于条形图的代码:(这是分配的控制器)
public String date1 = "";
public String date2 = "";
public String totalDate = "";
public int amount;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
totalDate = date1+" - "+date2;
System.out.println(totalDate);
System.out.println(""+amount);
XYChart.Series set1 = new XYChart.Series<>();
set1.getData().add(new XYChart.Data(totalDate, amount));
barChart1.getData().addAll(set1);
}
我没有收到任何错误,但是 assignedController 中的 int 数量是 = 0 并且两个字符串 return 什么都没有。
这是条形图页面的 fxml:
<AnchorPane id="AnchorPane" prefHeight="473.0" prefWidth="737.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="reports.AssignedReportController">
<children>
<BarChart fx:id="barChart1" layoutX="119.0" layoutY="44.0" title="Stock Assigned">
<xAxis>
<CategoryAxis fx:id="monthAxis" label="Month" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis fx:id="amountAxis" label="Amount Sold" side="LEFT" />
</yAxis>
</BarChart>
</children>
</AnchorPane>
控制器中的 initialize()
方法在执行 FXMLLoader.load()
期间被调用,这当然是在您设置控制器中的值之前。您需要在控制器上调用一个方法来更新数据。 (这是一个很好的例子,说明为什么你不应该使用 public 字段 - 它允许更改这些字段而不控制可能依赖于它们的其他字段(在本例中为条形图)发生的情况。)
你需要这样的东西
public class AssignedReportController {
@FXML
private BarChart<String, Number> barchart1 ;
private XYChart.Series<String, Number> set1 ;
public void initialize() {
set1 = new XYChart.Series<>();
barChart1.getData().add(set1);
}
public void setDates(String date1, String date2, int amount) {
String totalDate = date1 + " - " + date2 ;
set1.getData().add(new XYChart.Data<>(totalDate, amount));
}
// ...
}
然后在你的按钮处理程序中你只需要
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.setDates(date1, date2, count);
顺便说一句,您应该考虑为此在 SQL 中使用计数函数,并且您应该关闭不再使用的 JDBC 资源:
public void okayBtnPressed() throws SQLException, IOException{
con = handler.getConnection();
String query1 = "SELECT COUNT(*) FROM assigned WHERE Date BETWEEN ? AND ?";
pst = con.prepareStatement(query1);
pst.setString(1, datePickerFrom.getValue().toString());
pst.setString(2, datePickerTo.getValue().toString());
ResultSet rs = pst.executeQuery();
int count = rs.next().getInt(1);
rs.close();
pst.close();
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/bownhrmain1/reports/assignedReport.fxml"));
Parent root = myLoader.load();
AssignedReportController assignedController = myLoader.getController();
if(count == 0){
// no results
} else {
System.out.println(""+count);
System.out.println(datePickerFrom.getValue().toString());
System.out.println(datePickerTo.getValue().toString());
date1 = datePickerFrom.getEditor().getText();
date2 = datePickerTo.getEditor().getText();
assignedController.setDates(date1, date2, count);
Stage window = (Stage)(okayBtn.getScene()).getWindow();
Scene scene = new Scene(root);
window.setScene(scene);
}
}