2012-05-15 67 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