我正在尝试使用VLCJ构建自己的视频播放器,但我遇到了问题。
我的代码是
import java.awt.*;
import javax.swing.*;
import com.sun.jna.*;
import uk.co.caprica.vlcj.component.*;
import uk.co.caprica.vlcj.runtime.*;
public class MainFrame extends JFrame {
public MainFrame(String vlcPath, String username) {
super("Player");
setSize(1366,700);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcPath);
EmbeddedMediaPlayerComponent player = new EmbeddedMediaPlayerComponent();
setContentPane(player);
JPanel panel = new JPanel();
player.add(panel, BorderLayout.EAST);
Dimension d = new Dimension(300,200);
panel.setOpaque(false);
panel.setLayout(null);
panel.setPreferredSize(d);
panel.setSize(d);
setVisible(true);
player.getMediaPlayer().playMedia("path to video");
}
}
现在,正如您所看到的,我希望视频播放器在整个屏幕上,我希望右侧有透明背景的叠加层。
此代码给出了以下内容:
JPanel的背景由于某种原因是黑色的,而不是透明的。我尝试创建自己的类,扩展JPanel并覆盖paintComponent(Graphics g),但结果是一样的。
问题是,我怎样才能使其透明?
答案 0 :(得分:3)
视频以重量级AWT Canvas
播放。
你不能覆盖透明的Swing组件,它根本不会起作用。
选项:
Window
并将叠加层放在那里 - 这是有效的,因为您的窗口管理器可以处理顶层窗口的透明度 - 这个问题是它有点笨重,因为它有点笨拙你必须保持两个帧同步,如果你移动它们或最小化它们,你的窗口管理器也可能实现某种混合效果,这不是你想要的; Label
- 但即便如此,标签本身也不会具有透明背景; 对于#1中描述的方法,您可以在setOverlay()
实例上使用EmbeddedMediaPlayer
方法,也可以使用enableOverlay()
打开和关闭叠加层。
对于#2中描述的方法,这可能是最干净的方法,因为它不依赖于任何笨重的解决方法(比如保持两个顶级窗口同步),代价是更多的CPU使用率和非本机视频播放。
这些都不是理想的,但它是你能做的最好的。
您也应该查看vlcj测试源,因为有一些示例显示了如何进行这样的叠加。