Диалог прогресса в SwingWorker - PullRequest
2 голосов
/ 14 ноября 2011

У меня есть метод register (), выполнение которого занимает много времени.Так что я поместил его в doInBackGround () из Swingworker.В то же время я хочу отобразить диалоговое окно, которое является модальным и имеет неопределенный индикатор выполнения.

private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    // TODO add your handling code here:
    WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
    dialog.addWindowListener(new java.awt.event.WindowAdapter() {


    });
    dialog.setVisible(true);
    SwingWorker worker = new SwingWorker() {

        @Override
        protected Object doInBackground() throws Exception {
            register();
            return 0;
        }
    };
    dialog.dispose();   
}

Но все зависает.В отладчике я вижу, что regester () не вызывается.Где я все испортил?Любая помощь будет оценена!Спасибо!

1 Ответ

5 голосов
/ 14 ноября 2011

Ваш dialog.dispose вызывается после вызова setVisible (true) в диалоговом окне модальный , поэтому dispose никогда не будет вызываться. Вместо этого имейте dispose, вызванный в переопределении done в SwingWorker, и вызовите execute на SwingWorker до , вызвав setVisible (true) в диалоговом окне.

Примерно так (предостережение, код не тестировался):

private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
    dialog.addWindowListener(new java.awt.event.WindowAdapter() {

    });
    SwingWorker worker = new SwingWorker() {

        @Override
        protected Object doInBackground() throws Exception {
            register();
            return 0;
        }

        @Override
        protected void done() {
            dialog.dispose();
        }
    };
    worker.execute();
    dialog.setVisible(true);
}
...