Как отобразить индикатор выполнения, видимый для конечного пользователя, когда программа Java просматривает тысячи данных? - PullRequest
1 голос
/ 07 мая 2019

У меня есть метод 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;
}

Не могли бы вы помочь мне, как показать индикатор выполнения / статус в этом случае?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Как уже упоминалось в комментариях: JFrame работает на компьютере, на котором выполняется этот Java-код. Итак, прежде всего: ваша идея использовать JFrame работает , а не . Легко и просто.

Теперь реальный вопрос: как пользователи вашего сервиса взаимодействуют с этим удаленным сервером? Как: реальный ответ заключается в том, что вы должны предоставить эту «информацию о прогрессе» в «клиентской части» вашего приложения.

Поскольку вы пометили servlet , я предлагаю вам использовать Ajax для предоставления информации о прогрессе, см. здесь для получения более подробной информации.

0 голосов
/ 07 мая 2019

вы должны выполнять свою тяжелую работу (большой цикл) в другом потоке асинхронным способом.таким образом, вы позволяете вашему потоку пользовательского интерфейса реагировать на пользователя, и в то же время вы можете отправлять ход работы в поток пользовательского интерфейса.Есть много примеров, чтобы сделать это в Интернете ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...