繁体   English   中英

将JPanel背景设置为透明

[英]Setting JPanel background to transparent

我正在尝试使用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),但结果是一样的。

问题是,我怎样才能让它变得透明?

视频正在重量级的AWT Canvas播放。

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

选项:

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

对于#1中描述的方法,您可以在EmbeddedMediaPlayer实例上使用setOverlay()方法,也可以使用enableOverlay()来打开和关闭叠加层。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM