我有一个带有循环的Java方法。循环迭代了数千个数据,需要大量时间。在这种情况下,我想向我的程序的用户显示进度状态。
我已将JProgressBar
与JFrame
一起使用,但仅在程序在本地计算机中运行时才有效。当我将应用程序部署到远程服务器(生产服务器(并运行它时,进度栏不会出现。
以下是我的方法:
public List<EmployeeDetail> getEmployeeDetail(HttpServletRequest request, HttpServletResponse response, String org) {
List<EmployeeDetail> employeeDetailList = new ArrayList<EmployeeDetail>();
List<Employee> employeeList = getEmployee(org);
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
String query = "SELECT EMPLOYEE_NUMBER, START_DATE " + " FROM EMPLOYEE_HISTORY_TABLE "
+ "WHERE EMPLOYEE_NUMBER =?";
DatabaseConnection dbConnection = new DatabaseConnection();
// --progress bar starts---
// Create frame for dialog box
JFrame frame = new JFrame("searching data...");
// creates progress bar
final JProgressBar pb = new JProgressBar(0, EmployeeList.size());
pb.setStringPainted(true);
// add progress bar
frame.setLayout(new FlowLayout());
frame.getContentPane().add(pb);
frame.setSize(300, 200);
frame.setVisible(true);
int counterForProgressBar = 0;
for (Employee Employee : EmployeeList) {
try {
con = dbConnection.getConnectionDetails();
// --Progress bar continues--
final int currentValue = counterForProgressBar;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pb.setValue(currentValue);
}
});
java.lang.Thread.sleep(100);
// --Progress bar ends---
String firstName = Employee.getFirstName();
String lastName = Employee.getLastName();
String personNumber = Employee.getPersonNumber;
st = con.prepareStatement(query);
st.setString(1, personNumber);
rs = st.executeQuery();
while (rs.next()) {
String employee_number = rs.getString("EMPLOYEE_NUMBER");
Date START_DATE = rs.getDate("START_DATE");
EmployeeDetail employeeDetail = new EmployeeDetail(firstName, lastName, employee_number, START_DATE);
employeeDetailList.add(employeeDetail);
}
counterForProgressBar++;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
con.close();
st.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// When data search process completes close the progress bar
frame.dispose();
return employeeDetailList;
}
您能帮我如何在这种情况下显示进度栏/状态吗?预先感谢您!
您应该以异步方式在另一个线程上进行努力工作(大循环(。像这样,您让您的UI线程对用户进行了反应,并同时可以将工作进度发送到UI线程。互联网中有很多示例。
如注释中已经提到的:jframe在运行Java代码的机器上运行。因此,首先:您使用Jframe的想法不工作。干净利落。
现在真正的问题是:服务用户如何与该远程服务器进行交互?AS:真正的答案是,您必须在应用程序的"客户端"内提供"进度信息"。
用 servlet标记,我建议您考虑使用Ajax提供进度信息,请参阅此处。