当Java程序通过数千个数据循环时,如何显示最终用户的进度条



我有一个带有循环的Java方法。循环迭代了数千个数据,需要大量时间。在这种情况下,我想向我的程序的用户显示进度状态。

我已将JProgressBarJFrame一起使用,但仅在程序在本地计算机中运行时才有效。当我将应用程序部署到远程服务器(生产服务器(并运行它时,进度栏不会出现。

以下是我的方法:

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提供进度信息,请参阅此处。

最新更新