2013-12-10 1 views
0

У меня есть данные, хранящиеся в Jtable, а затем я беру эти данные по строке и передавая эти данные в вызываемую процедуру в базе данных (1 вызов для каждой строки), а процедура возвращает сообщение после завершения, этот процесс занимает почти 1-2 минуты для каждого вызова, может кто-нибудь сказать мне, как я могу отобразить единый индикатор прогресса для всего процесса. (Я имею в виду 1 индикатор выполнения для всего вызова), я хочу, чтобы индикатор выполнения был закончен после завершения цикла.Как отобразить индикатор выполнения для вызова процедуры

Мой код ниже:

DefaultTableModel model = (DefaultTableModel) data.getModel(); 
for (int count = 0; count < model.getRowCount(); count++) { 
    CallableStatement csmt = con.prepareCall("{call CODE_REVIEW.PRC_WRAPPER_REVIEW(?,?,?,?)}"); 

    String folder=model.getValueAt(count, 0).toString(); 
    String type=model.getValueAt(count, 1).toString(); 
    String name=model.getValueAt(count, 2).toString(); 

    csmt.setString(1,name); 
    csmt.setString(2,type); 
    csmt.setString(3,folder); 
    csmt.registerOutParameter(4,java.sql.Types.VARCHAR); 
    csmt.execute(); 
    String messege =csmt.getString(4); 
} 
+0

Для этого вам нужно понять, что это такое EDT (Thread Dispatch Thread) и использовать поток для выполнения цикла и обновить индикатор выполнения в графическом интерфейсе. Обычно поток SwingWorker используется, поскольку его легко реализовать. – HpTerm

+0

вы должны проверить здесь, где я приведу пример: http://stackoverflow.com/questions/10773552/jprogressbar-update-from-swingworker – HpTerm

ответ

3

Вы можете использовать SwingWorker делать звонки в фоновом режиме и обновить индикатор в Event Dispatching Thread (А.К.А. EDT). Что-то вроде этого:

SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() { 
    @Override 
    protected Void doInBackground() throws Exception { 
     int processed = 0; 
     DefaultTableModel model = (DefaultTableModel) data.getModel(); 
     for (int count = 0; count < model.getRowCount(); count++) { 
      //... 
      String messege = csmt.getString(4); 
      processed++; 
      publish(processed/model.getRowCount() * 100); 
     } 
     return null; 
    } 

    @Override 
    protected void process(List<Integer> list) { 
     progressBar.setValue(list.get(list.size() - 1)); 
    } 
}; 
worker.execute(); 

Посмотрите на Worker Threads and SwingWorker секции в Concurrency in Swing след.

+1

+1 для того, чтобы быть быстрее меня, собирался опубликовать почти тот же пример кода – HpTerm

+0

Благодаря! И +1 для вас в этом замечательном вопросе :) @HpTerm – dic19

1

Для обновления пользовательского интерфейса вам необходимо использовать SwingWorker, пока вы делаете длинный фоновый процесс.

Прочитать tutorail для SwingWorker и Concurency in Swing.