2010-08-06 3 views
1

Я пытаюсь использовать потоки для выполнения операции увеличения длины в фоновом режиме и обновления пользовательского интерфейса. Вот что я пытаюсь сделать:Проблема с Java Thread - обновление GUI

  1. на кнопку мыши, отображается popupjframe с сообщением «Установка в БД»
  2. создать новый поток для вставки 1000s записей в базе данных.
  3. когда элементы вставлены, я хочу popupjframe исчезнуть и отображения JOptionPane с да, нет кнопки
  4. по нажатию кнопки да я хочу, чтобы отобразить другой кадр с докладом/сведения о процессе вставки

Вот мой код:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
//display popupframe first 

jFrame1.pack(); 
jFrame1.setVisible(true); 
jFrame1.setLocationRelativeTo(getFrame()); 
Thread queryThread = new Thread() { 
public void run() { 
runQueries(); 
}}; 
queryThread.start(); 
} 

//runqueries method inserts into DB

private void runQueries() { 
for (int i = 0; i <= 50000; i++) { 
insertintoDB(); 
updateProgress(i); 
} 
} 

//update the popupjframe 
private void updateProgress(final int queryNo) { 
SwingUtilities.invokeLater(new Runnable() { 
public void run() { 
if (queryNo == 50000) { //means insertion is done 
jFrame1.setVisible(false); 

int n = JOptionPane.showConfirmDialog(getFrame(), menuBar, null, JOptionPane.YES_NO_OPTION); 

if (n == 1) { //NO option was selected 
return;} 
else 
//display another popupframe with details/report of inserting process 
}}); 
} 
  1. Является ли мой подход правильным?
  2. Как и когда Я останавливаю/прерываю запрос «запрос»?
  3. Правильно ли, если я сделал popupjframe в методе runqueries (после цикла for) и отобразил joptionpane ??

Заранее спасибо.

+0

В ваших runQueries() метод, вы вызываете UpdateProgress() 50000 раз, каждый раз создавая новый поток, в то время как только последний нужно сделать любую полезную работу. Это может быть не тяжело, но это лишние накладные расходы и вводящий в заблуждение код в лучшем случае. И ILMTitan верен: SwingWorker - это правильный способ пойти сюда. –

ответ

4

Посмотрите на документацию для SwingWorker. Он делает именно то, что вы пытаетесь сделать. Создайте подкласс и вызовите runQueries из doInBackground(), а затем выполните то, что делает ваш runnable (минус проверка ifNo) в done(). Существуют сторонние версии этого класса, если вы не используете java 1.6.

class DbSwingWorker extends SwingWorker<Void, Integer> { 

    @Override 
    protected Void doInBackground() throws Exception { 
     for (int i = 0; i <= 50000; i++) { 
      insertintoDB(); 
      publish(i); //if you want to do some sort of progress update 
     } 
     return null; 
    } 

    @Override 
    protected void done() { 
     int n = JOptionPane.showConfirmDialog(getFrame(), menuBar, null, JOptionPane.YES_NO_OPTION); 

     if (n == 1) { //NO option was selected 
      return; 
     } else { 
      //display another popupframe with details/report of inserting process 

     } 
    } 
} 

оригинальные, не версии 1.6 можно найти здесь: https://swingworker.dev.java.net/

+0

Также см. . –

Смежные вопросы