2012-05-15 70 views
4

我試圖播放視頻使用vlcj內JPanel,但它不適合我。我得到的消息異常是「java.lang.IllegalStateException:視頻表面組件必須可顯示」,這與Keep getting an Error "Component must be displayable"中的問題相同。試圖嵌入vlcj媒體播放器在一個WindowsCanvas內JPanel

其中包含畫布和vlcj球員的JPanel的代碼是這樣的:

import javax.swing.JPanel; 

import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 

import java.awt.Canvas; 
import java.awt.Color; 

import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.player.MediaPlayerFactory; 
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; 
import uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 
import uk.co.caprica.vlcj.runtime.windows.WindowsCanvas; 

public class MyJPanel extends JPanel { 
private EmbeddedMediaPlayer player; 
private WindowsCanvas canvas; 

public MyJPanel() { 
    canvas = new WindowsCanvas(); 
    add(canvas); 
    revalidate(); 
    repaint(); 

    canvas.setVisible(true); 

    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(); 
    player = mediaPlayerFactory.newEmbeddedMediaPlayer(); 

    CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas); 

    player.setVideoSurface(videoSurface); 
    player.playMedia("v.avi"); // This sentence throws the exception. 
} 
} 

MyJFrame擴展JFrame的,只包含了MyJPanel的JPanel。我認爲這根本不重要。

import javax.swing.JFrame; 

public class MyJFrame extends JFrame { 
protected MyJPanel myJPanel; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       MyJFrame frame = new MyJFrame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public MyJFrame() { 
    myJPanel = new myJPanel(); 
    add(myJPanel); 
} 
} 

在此先感謝。

+0

我可以問十幾個問題,但他們都將在1 [SSCCE](http://sscce.org/)中回答。爲什麼不發佈SSCCE? –

+0

@AndrewThompson編輯。謝謝。 – honnix

+0

O ... K這兩個來源中的哪一個是SSCCE? –

回答

6

您試圖在包含畫布的框架設置爲可見之前播放媒體。您需要將playMedia()呼叫置於單獨的方法中,並在之後將其稱爲整個幀已創建並設置爲可見。

編輯:

如果您仍然希望它直客玩,只需調用相關的方法,你已經創建並提出您的框架可見後:

MyJFrame frame = new MyJFrame(); 
frame.setVisible(true); 
frame.startPlaying(); 

...很明顯,你會需要在MyJFrame上定義startPlaying(),但它應該直接開始播放。你只需要首先設置框架可見。

+0

)你無法想象我有多麼感謝你的幫助,真的非常感謝,我創建了一個JButton來開始播放,儘管我更喜歡自動播放,這是什麼原因?我不明白爲什麼它不會。 t運行 – honnix

+0

@honnix沒問題,請參閱編輯 – berry120

+0

它完美地工作,框架是否決定繪製組件的不同順序? – honnix