Java 将JPanel背景设置为透明

Java 将JPanel背景设置为透明,java,swing,vlcj,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 v

我正在尝试使用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并覆盖了paintComponentGraphics g,但结果是一样的


问题是,如何使其透明?

视频在重量级AWT画布上播放

你不能在上面覆盖一个透明的Swing组件,它根本不起作用

选项:

覆盖一个透明的顶层窗口,并将覆盖放在其中-这是有效的,因为您的窗口管理器可以处理顶层窗口的透明度-问题是它有点笨重,因为如果您移动或最小化它们,您必须保持两个帧同步,此外,您的窗口管理器可能会实现某种混合效果,这不是您想要的; 使用直接渲染媒体播放器,在每个帧的顶部绘制您自己的覆盖图-缺点是它比本机渲染效率低,因为您自己的应用程序必须渲染每个帧,尽管它可以工作; 仅在覆盖中使用重量级组件,如标签-但即使这样,标签本身也不会有透明背景; 对于1中描述的方法,您可以在EmbeddedMediaPlayer实例上使用setOverlay方法,也可以使用enableOverlay打开和关闭覆盖

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

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


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

视频正在重量级AWT画布中播放

你不能在上面覆盖一个透明的Swing组件,它根本不起作用

选项:

覆盖一个透明的顶层窗口,并将覆盖放在其中-这是有效的,因为您的窗口管理器可以处理顶层窗口的透明度-问题是它有点笨重,因为如果您移动或最小化它们,您必须保持两个帧同步,此外,您的窗口管理器可能会实现某种混合效果,这不是您想要的; 使用直接渲染媒体播放器,在每个帧的顶部绘制您自己的覆盖图-缺点是它比本机渲染效率低,因为您自己的应用程序必须渲染每个帧,尽管它可以工作; 仅在覆盖中使用重量级组件,如标签-但即使这样,标签本身也不会有透明背景; 对于1中描述的方法,您可以在EmbeddedMediaPlayer实例上使用setOverlay方法,也可以使用enableOverlay打开和关闭覆盖

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

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

您可能还应该查看vlcj测试源,因为有一些示例显示了如何进行这样的覆盖