gpt4 book ai didi

java - 将数据从一个场景传递到另一个场景不起作用? (按照我对其他所有人的方式进行操作)

转载 作者:行者123 更新时间:2023-12-02 11:57:21 25 4
gpt4 key购买 nike

基本上,我试图输入 2 个日期,这些日期将传递到另一个 Controller 中的 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 上的行值。

此报告显示在 2 个不同日期之间分配给员工的项目数。

这是将数据应用到条形图的代码:(这是分配的 Controller )

 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);
}

我没有收到任何错误,但分配 Controller 中的 amount 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>

最佳答案

Controller 中的 initialize() 方法在执行 FXMLLoader.load() 期间被调用,这当然是在您在 Controller 中设置值之前。您需要调用 Controller 上更新数据的方法。 (这是一个很好的例子,说明了为什么您永远不应该使用公共(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);
}
}

关于java - 将数据从一个场景传递到另一个场景不起作用? (按照我对其他所有人的方式进行操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47511903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com