java - Canvas 上的透明 JPanel (VLCJ)

标签 java swing canvas jpanel vlcj

我知道一个类似的问题是 posted before ,但没有答案或示例代码。

我需要在 Canvas 上放置一个透明的 JPanel。下面发布的代码不起作用

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Main {
    private static class Background extends Canvas{
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.RED);
            g.drawOval(10, 10, 20, 20);
        }
    }

    private static class Transparent extends JPanel {

        public Transparent() {
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GREEN);
            g.drawOval(20, 20, 20, 20);
        }
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        JLayeredPane layered = new JLayeredPane();
        Background b = new Background();
        Transparent t = new Transparent();

        layered.setSize(200, 200);
        b.setSize(200, 200);
        t.setSize(200, 200);

        layered.setLayout(new BorderLayout());
        layered.add(b, BorderLayout.CENTER, 1);
        layered.add(t, BorderLayout.CENTER, 0);

        frame.setLayout(new BorderLayout());
        frame.add(layered, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }
}

使用整个框架的 GlassPane 属性是最后的解决方案(非常不鼓励)

最佳答案

您可能无法让它工作,因为您将重量级和轻量级组件混合在一起。

过去,不可能在像 Canvas 这样的重量级组件上绘制轻量级面板。由于 JDK 6 Update 12 和 JDK 7 build 19 Java 已更正此问题,您可以正确重叠 2,但它有限制。特别是在您的情况下,Overlapping swing 组件不能是透明的。

可以在此页面上找到对此的一个很好的描述,包括较新的行为:Mixing Heavyweight and Lightweight Components检查您的特定问题的限制部分。

我不认为使用 GlassPane 会有帮助,因为它也很轻。

如果您更改 BackGround 类以扩展 JPanel 而不是 Canvas,您将获得所需的行为。

关于java - Canvas 上的透明 JPanel (VLCJ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759983/

相关文章:

java - 设计一个用java读取大型excel文件的应用程序时遇到的问题

javascript - 使用类似于 Gmail 添加计数的图像处理的动态图标

javascript - 如何在 HTML5 Canvas 中随文本一起绘制和旋转图像

java - 不支持的表单文件版本 : 1. 9. 表单无法打开

python - 在 python3 中通过 PDF 写入文本

java - 如何为没有标题栏的 JFrame 提供拖动功能?

java - 将数组传递给可变参数方法

java - 代号一 : Annotation Processing

java - 如何将 Swing 应用程序转换为 Applet?

java - 将 JApplet 添加到 JFrame(或 AWT 框架)