将JPanel背景设置为透明

时间:2014-12-21 13:43:19

标签: java swing vlcj

我正在尝试使用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");
    }
}

现在,正如您所看到的,我希望视频播放器在整个屏幕上,我希望右侧有透明背景的叠加层。

此代码给出了以下内容:

enter image description here

JPanel的背景由于某种原因是黑色的,而不是透明的。我尝试创建自己的类,扩展JPanel并覆盖paintComponent(Graphics g),但结果是一样的。

问题是,我怎样才能使其透明?

1 个答案:

答案 0 :(得分:3)

视频以重量级AWT Canvas播放。

你不能覆盖透明的Swing组件,它根本不会起作用。

选项:

  1. 覆盖透明顶层Window并将叠加层放在那里 - 这是有效的,因为您的窗口管理器可以处理顶层窗口的透明度 - 这个问题是它有点笨重,因为它有点笨拙你必须保持两个帧同步,如果你移动它们或最小化它们,你的窗口管理器也可能实现某种混合效果,这不是你想要的;
  2. 使用"直接"渲染媒体播放器并在每个帧的顶部绘制自己的叠加层 - 缺点是它的效率低于本机渲染,因为您自己的应用程序必须渲染每个帧(虽然它确实有效);
  3. 仅使用叠加层中的重量级组件,例如Label - 但即便如此,标签本身也不会具有透明背景;
  4. 对于#1中描述的方法,您可以在setOverlay()实例上使用EmbeddedMediaPlayer方法,也可以使用enableOverlay()打开和关闭叠加层。

    对于#2中描述的方法,这可能是最干净的方法,因为它不依赖于任何笨重的解决方法(比如保持两个顶级窗口同步),代价是更多的CPU使用率和非本机视频播放。

    这些都不是理想的,但它是你能做的最好的。

    您也应该查看vlcj测试源,因为有一些示例显示了如何进行这样的叠加。