2011-08-26 70 views
1

我有一个运行VLCJ的小程序(http://code.google.com/p/vlcj/) - 基本上将VLC播放器嵌入到小程序中。 在eclipse中运行时,它运行良好,但我无法关闭调试applet窗口或以某种方式终止它。我想知道,这是为什么?代码中是否有阻止其停止调试的内容?我必须重新启动eclipse才能退出。我很肯定你不需要添加destroy()来关闭调试窗口。无法在eclipse中关闭小程序

感谢

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

的原因是在此代码段部分:

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代码System.exit()方法(甚至applet代码),因为它可以关闭JVM由其他Java应用程序/ servlet/applet代码可能需要的代码使用。见Alternatives to System.exit(1),Calling System.exit() in Servlet's destroy() method