Java 在JPanel中嵌入vlcj播放器

Java 在JPanel中嵌入vlcj播放器,java,swing,jpanel,vlcj,embedded-media,Java,Swing,Jpanel,Vlcj,Embedded Media,嗨,我想在jpanel中添加一个vlcj播放器 我正在使用并意识到这一点。我还使用了一个关于如何使用embeddedMediaPlayerComponent的教程。我已经在JFrame中播放了视频。我现在想把vlcj播放器放在JPanel中,但我仍然有错误的行为 下面是我的主类代码,其中jframe位于 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphi

嗨,我想在jpanel中添加一个vlcj播放器

我正在使用并意识到这一点。我还使用了一个关于如何使用embeddedMediaPlayerComponent的教程。我已经在JFrame中播放了视频。我现在想把vlcj播放器放在JPanel中,但我仍然有错误的行为

下面是我的主类代码,其中jframe位于

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Observable;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import com.sun.jna.NativeLibrary;

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

public class VlcPlay extends JFrame {

public static void main(final String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new VlcPlay();
        }
    });
}

private VlcPlay() {
    this.setTitle("Test");

    /* Initialize the JFrame */
    this.setLocation(100, 100);
    this.setSize(1050, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    TestClass p = new TestClass(); // The panel

    this.add(p, BorderLayout.CENTER); // Add the panel

    this.setVisible(true);

    p.play();


}
}
这是嵌入mediaplayer的代码:

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

import javax.swing.JPanel;

import com.sun.jna.NativeLibrary;

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;


public class TestClass extends JPanel {
private EmbeddedMediaPlayerComponent ourMediaPlayer;
TestClass(){
    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");

    ourMediaPlayer = new EmbeddedMediaPlayerComponent();



    /* Set the canvas */
    Canvas c = new Canvas();
    c.setBackground(Color.black);
    c.setVisible(true);

    /* Set the layout */
    this.setLayout(new BorderLayout());

    /* Add the canvas */
    this.add(c, BorderLayout.CENTER);
    this.setVisible(true);



}
public void play() {
    /* Play the video */
    ourMediaPlayer.getMediaPlayer().playMedia("Movie on 25-04-14 at 11.41.mp4");

}
}
编辑:我得到的错误如下:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: The video surface component must be displayable
    at uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface.attach(CanvasVideoSurface.java:75)
    at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.attachVideoSurface(DefaultEmbeddedMediaPlayer.java:156)
    at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.onBeforePlay(DefaultEmbeddedMediaPlayer.java:315)
    at uk.co.caprica.vlcj.player.DefaultMediaPlayer.play(DefaultMediaPlayer.java:705)
    at uk.co.caprica.vlcj.player.DefaultMediaPlayer.playMedia(DefaultMediaPlayer.java:222)
    at TestClass.play(TestClass.java:41)
    at VlcPlay.<init>(VlcPlay.java:42)
    at VlcPlay.<init>(VlcPlay.java:28)
    at VlcPlay$1.run(VlcPlay.java:23)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
线程“AWT-EventQueue-0”java.lang.IllegalStateException中的异常:视频表面组件必须是可显示的 在uk.co.caprica.vlcj.player.embedded.videosurface.canvasvideossurface.attach(canvasvideossurface.java:75)上 位于uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.attachVideoSurface(DefaultEmbeddedMediaPlayer.java:156) 在uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.onBeforePlay上(DefaultEmbeddedMediaPlayer.java:315) 在uk.co.caprica.vlcj.player.DefaultMediaPlayer.play(DefaultMediaPlayer.java:705) 在uk.co.caprica.vlcj.player.DefaultMediaPlayer.playMedia(DefaultMediaPlayer.java:222) 在TestClass.play(TestClass.java:41) 在VlcPlay。(VlcPlay.java:42) 在VlcPlay。(VlcPlay.java:28) VlcPlay$1.run(VlcPlay.java:23) 在java.awt.event.InvocationEvent.dispatch(未知源)处 位于java.awt.EventQueue.dispatchEventImpl(未知源) 位于java.awt.EventQueue.access$200(未知源) 在java.awt.EventQueue$3.run处(未知源) 在java.awt.EventQueue$3.run处(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源) 位于java.awt.EventQueue.dispatchEvent(未知源) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.run(未知源) 任何帮助都将不胜感激


提前感谢。

解决:忘记将embeddedMediaPlayerComponent添加到JPanel。

本质上是的副本。不是因为我做了解决方案要求您做的事情,它仍然不起作用……Nvm解决了问题,忘了添加embeddedMediaPlayerComponent。我的错。别忘了,EmbeddedMediaPlayerComponent是一个重量级组件,如果添加到像JPanelf这样的轻量级组件中,它可能不会很好地发挥作用。对于这种类型的用例,向JPanel添加画布是绝对好的,至少使用当代JDK(从Java6u12开始)。