Не удается закрыть апплет в затмении - PullRequest
1 голос
/ 26 августа 2011

У меня есть апплет, который запускает VLCJ (http://code.google.com/p/vlcj/) - по сути, встраивает проигрыватель VLC в апплет. При запуске в eclipse он работает нормально, но я не могу закрыть окно апплета отладки или как-то его прекратить. Интересно, а почему это? Есть ли в коде что-нибудь, что мешает отладке? Я должен перезапустить затмение, чтобы оно прекратилось. Я совершенно уверен, что вам не нужно добавлять destroy (), чтобы разрешить закрытие окна отладки.

Спасибо

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Frame;
import javax.swing.JApplet;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import com.sun.jna.NativeLibrary;

import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;


public class Main extends JApplet {

    /**
     * @param args
     */
    /* entry point */
    public void init() {
        String file = "110825-155446.wmv";    // only 2-3 seconds clip for minimum storage      
        runVideo(file);
    }

    /* runs the video file */
    public void runVideo(String file) {

        setSize(400,300);
        setLayout(new BorderLayout()); 
        Canvas vs = new Canvas();
        add(vs,BorderLayout.CENTER);
        setVisible(true);

        MediaPlayerFactory factory = new MediaPlayerFactory();

        EmbeddedMediaPlayer mediaPlayer = factory.newEmbeddedMediaPlayer();
        mediaPlayer.setVideoSurface(factory.newVideoSurface(vs));

        mediaPlayer.playMedia(file);
        try {
            Thread.currentThread().join();
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }


}

1 Ответ

1 голос
/ 15 ноября 2011

Причина в этом фрагменте кода:

try {
    Thread.currentThread().join();
} catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Блокирует закрытие приложения, поскольку оно не хочет возвращаться в систему. Thread.join() заставляет текущий поток ждать завершения другого потока, в основном он ждет вечно.

Чтобы улучшить его, вы можете сделать так (как в http://code.google.com/p/vlcj/wiki/MinimalMp3Player):

mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
  public void finished(MediaPlayer mediaPlayer) {
    System.exit(0);
  }
  public void error(MediaPlayer mediaPlayer) {
    System.exit(1);
  }
});
mediaPlayer.playMedia(args[0]);
Thread.currentThread().join();

Однако мы не можем использовать метод System.exit() в коде Java-сервлета (или даже в коде апплета), поскольку он может отключить JVM, используемую кодом, который может понадобиться другим кодам Java-приложений / сервлетов / апплетов. См. Альтернативы System.exit (1) , Вызов System.exit () в методе destroy () сервлета

...