[英]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行都打印正確的日期,在這種情況下,它打印正確的日期,並返回1的行值。
此報告顯示在兩個不同日期之間分配給員工的項目數。
這是將數據應用於條形圖的代碼:(這是assignedController)
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,並且兩個字符串均未返回任何內容。
這是條形圖頁面的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>
在執行FXMLLoader.load()
的過程中會調用控制器中的initialize()
方法,這當然是在控制器中設置值之前。 您需要在控制器上調用更新數據的方法。 (這是為什么您永遠不要使用公共字段的一個很好的示例-它允許更改這些字段而無需控制可能依賴於其他字段的其他字段(在本例中為條形圖)發生的情況。)
你需要類似的東西
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中使用count函數,並且應該關閉不再使用的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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.