使用SwingNode在JavaFX中显示VlcJ

使用SwingNode在JavaFX中显示VlcJ,java,swing,javafx-8,vlcj,Java,Swing,Javafx 8,Vlcj,FXMLController初始化方法: @FXML private VBox vbContainer; MediaPlayerVLC m_mediaPlayer; public void initialize(URL url, ResourceBundle rb) { final SwingNode swingNode = new SwingNode(); m_mediaPlayer = new MediaPlayerVLC(); creat

FXMLController初始化方法:

@FXML
private VBox vbContainer;
MediaPlayerVLC m_mediaPlayer;

public void initialize(URL url, ResourceBundle rb) {
        final SwingNode swingNode = new SwingNode();

        m_mediaPlayer = new MediaPlayerVLC();
        createAndSetSwingContent(swingNode, m_mediaPlayer);

        vbContainer.getChildren().add(0, swingNode);
    }
和createAndSetSwingContent():

MediaPlayerVLC类:

package javafxswing;

import javax.swing.JPanel;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;

public class MediaPlayerVLC extends JPanel {

    private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

    public MediaPlayerVLC() {

        setSize(350, 320);
        setVisible(true);        
        mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
        mediaPlayerComponent.setSize(350, 320);
        add(mediaPlayerComponent);
    }

    public MediaPlayer getMediaPlayer() {
        return mediaPlayerComponent.getMediaPlayer();
    }
}
我通过单击FXMLController中的按钮来播放媒体:

@FXML
private void handleButtonAction(ActionEvent event) {
     System.out.println("You clicked me!");
     m_currentVideo = "video.mov";
     m_mediaPlayer.getMediaPlayer().playMedia(m_currentVideo);
}
现在,问题是:视频开始播放,但我看不到图像。我说它开始播放是因为我能听到音频。我做错了什么


非常感谢您的帮助。

简而言之,这样做行不通

SwingNode
的Javdoc中:

它部分指出:

JComponent实例中包含的组件层次结构不应包含任何重量级组件,否则SwingNode可能无法绘制它

对于vlcj,嵌入式MediaPlayerComponent扩展了重型AWT组件
面板

要使用vlcj和JavaFX,您可能需要自己直接渲染视频数据。这就是vlcj所谓的DirectMediaPlayerComponent的功能。这种方法的本质是,
DirectMediaPlayerComponent
接收要渲染的每一帧视频数据,然后您可以使用
PixelWriter
或您想出的其他方法自己渲染


这里有一个vlcj javafx项目,这种方法适用于Java7。由于线程错误,它不适用于Java8,这里记录了:

谢谢您的回答。我已经尝试过这种方法,即使使用可写图像而不是画布,我也无法在Swing版本中获得vlcj的渲染性能。为了获得最佳性能,您需要重量级组件,并让VLC渲染视频。不幸的是,它在SwingNode中根本不起作用,坦率地说,也没有什么可以做的。这个答案有点过时了,现在推荐的方法是在现代版本的vlcj和JavaFX中使用新的PixelBuffer方法
@FXML
private void handleButtonAction(ActionEvent event) {
     System.out.println("You clicked me!");
     m_currentVideo = "video.mov";
     m_mediaPlayer.getMediaPlayer().playMedia(m_currentVideo);
}