我有一个运行VLCJ的小程序(http://code.google.com/p/vlcj/) - 基本上是在一个小程序中嵌入一个VLC播放器。 在eclipse中运行时,它运行良好,但我无法关闭调试applet窗口或以某种方式终止它。我想知道,这是为什么?代码中是否有任何东西阻止它停止调试?我必须重新启动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();
}
}
}
答案 0 :(得分:1)
原因在于此代码段部分:
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();
但是,我们不能在Java servlet代码(甚至是applet代码)中使用System.exit()
方法,因为它可以关闭其他Java应用程序/ servlet / applet代码可能需要的代码所使用的JVM。请参阅Alternatives to System.exit(1),Calling System.exit() in Servlet's destroy() method