如何使Java的JPanel和Graphics2D透明?

3

标题已经很明确了。我想用Java构建两个面板,一个在另一个上面的层中。我希望顶部层包含一个JPanel,其中包含一个graphics2d对象。我希望JPanel和graphics2d都具有透明背景(我仍然希望由graphics2d绘制的内容可见)。有人知道如何做到吗?


发布你的SSCCE。我们猜不到你在做什么。 - camickr
我在这里找到了更成功的答案:https://stackoverflow.com/a/19746756/48136 - bric3
1个回答

5
在JPanel上调用setOpaque(false) - 这样就不会绘制JPanel的背景。
根据您重写哪个方法以获取Graphics2D(JPanel不像组件一样包含Graphics2D对象 - Graphics2D对象用于绘制JPanel)- 如果它是paintComponent(),则应该阅读JComponent的JavaDocs - 并首先调用super.paintComponent(g),以便透明度得到尊重,然后进行其余的绘制。
工作示例:
package com.stackoverflow.opaque;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class OpaqueExample extends JFrame {

    private JLayeredPane layers;
    private JPanel up, down;
    private JButton toggleOpaque;

    public OpaqueExample() {
        layers = new JLayeredPane();

        down = new JPanel();
        down.setBackground(Color.GREEN);
        down.setBounds(100, 100, 200, 200);
        layers.add(down, new Integer(1));

        up = new JPanel() {
            public void paintComponent(Graphics og) {
                super.paintComponent(og);

                Graphics2D g = (Graphics2D)og;
                GradientPaint gradient = new GradientPaint(0, 0, Color.BLUE, 10, 0, 
                          Color.WHITE, true );

                Polygon poly = new Polygon();
                poly.addPoint(10, 10);
                poly.addPoint(100, 50);
                poly.addPoint(190, 10);
                poly.addPoint(150, 100);
                poly.addPoint(190, 190);
                poly.addPoint(100, 150);
                poly.addPoint(10, 190);
                poly.addPoint(50, 100);
                poly.addPoint(10, 10);

                g.setPaint(gradient);
                g.fill(poly);

                g.setPaint(Color.BLACK);
                g.draw(poly);
           }
        };
        up.setBackground(Color.RED);
        up.setBounds(150, 150, 200, 200);
        layers.add(up, new Integer(2));

        getContentPane().add(layers, BorderLayout.CENTER);

        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        toggleOpaque = new JButton("Toggle Opaque");
        toggleOpaque.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                up.setOpaque(!up.isOpaque());
                layers.repaint();
            }
        });
        buttonPanel.add(toggleOpaque);

        getContentPane().add(buttonPanel, BorderLayout.EAST);
    } 

    public static void main(String[] args) {
        JFrame f = new OpaqueExample();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500, 500);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

好的,我只是使用普通的画笔。 当我测试只使用单个jpanel而没有graphics2d并设置setOpaque(false)时,它仍然会隐藏下面的JPanel。顺便说一下,我正在使用JLayeredPane。 - vondip
对于 Swing 组件(除了某些特殊情况),你应该重写 paintComponent() 而不是 paint()。关于其余部分我不确定该说什么,因为没有发布代码,我不知道你具体在做什么。我将发布一个可行的简短示例。 - Nate
嗨,Nate, 我一直在查看是否可以在这里发送私人消息。想以更好的方式感谢你。你的示例代码简单易懂,让我明白了很多。我正在使用我的graphics2d,并注意到我调用了clearRect,导致我不断看到白屏。在更改此设置并调整为您的代码示例后,它起作用了!再次感谢。 - vondip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接