Апплет падает при перенаправлении на новый URL - PullRequest
1 голос
/ 12 февраля 2010

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

Но когда я запускаю апплет, я получаю эту ошибку после нажатия кнопки:

Исключение в потоке "SwingWorker-pool-1-thread-2" java.lang.IllegalMonitorStateException в java.util.concurrent.locks.ReentrantLock $ Sync.tryRelease (Неизвестный источник) at java.util.concurrent.locks.AbstractQueuedSynchronizer.release (неизвестный источник) в java.util.concurrent.locks.ReentrantLock.unlock (Неизвестный источник) в java.util.concurrent.LinkedBlockingQueue.poll (Неизвестный источник) в java.util.concurrent.ThreadPoolExecutor.getTask (Неизвестный источник) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник) at java.lang.Thread.run (неизвестный источник)

Похоже, что апплет самоуничтожается, но рабочий поток все еще жив. Если я добавлю Thread.sleep (2000); в качестве теста, апплет работает правильно, но я думаю, не правильный способ исправить это.

Что я делаю не так ?? Может мне сделать перенаправление из основного потока? Может, метод уничтожения апплета должен дождаться завершения рабочего потока?

Источник Java:

public class MyApplet extends javax.swing.JApplet {
    class MyWorker extends SwingWorker<Boolean , Void> {
        protected Boolean doInBackground() throws Exception {
  // DO THE HARD JOB...
        }

        public void done() {
  netscape.javascript.JSObject.getWindow(this).call("onDone", new String[] { "" });
        }
    }

    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {

                public void run() {
             initComponents();
                    setBackground(Color.WHITE);
                }
            });
        } catch (Exception ex) { 
  ex.printStackTrace();
 }
   }

   private void jMyButtonctionPerformed(java.awt.event.ActionEvent evt) {                                              
        new MyWorker().execute();        
    }                                             
}

Источник HTML:

<script type="text/javascript">
function onDone(){document.location.href="http://myurl.com";}
</script>

1 Ответ

0 голосов
/ 12 февраля 2010

Окончательно решено с помощью SwingUtilities.invokeLater: D

...