2011-08-26 42 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