Проблема Java Thread - обновление графического интерфейса - PullRequest
1 голос
/ 06 августа 2010

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

  1. при нажатии кнопки, отобразить popupjframe с сообщением «Вставка в БД»
  2. создать новый поток для вставки 1000 записей вбазы данных.
  3. при вставке записей, я хочу, чтобы всплывающее окно исчезло и отображало окно с кнопками да, без кнопок
  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. Как и когда остановить / прервать "queryThread" ??
  3. Правильно ли, если я создаю popupjframe в самом методе runqueries (после цикла for) и отображаю панель joption ??

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

1 Ответ

4 голосов
/ 06 августа 2010

Посмотрите документацию для SwingWorker . Это именно то, что вы пытаетесь сделать. Создайте подкласс и вызовите runQueries из doInBackground (), а затем сделайте то, что делает ваш runnable (за исключением проверки if queryNo) в 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/

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