如何使java JPanel和graphics2d透明?

如何使java JPanel和graphics2d透明?,java,graphics,jpanel,Java,Graphics,Jpanel,这个标题是不言自明的。我想使用java构建两个面板,一个在另一个面板上,一个在层中。我希望顶层包含一个JPanel,其中将包含一个graphics2d对象。我希望JPanel和graphics2d都有透明的背景(我仍然希望graphics2d绘制的内容可见)。有人知道怎么做吗?在JPanel上调用setOpaque(false)——这不会绘制JPanel的背景 取决于您要覆盖的获取Graphics2D的方法(JPanel不包含像组件一样的Graphics2D对象-Graphics2D对象用于绘制

这个标题是不言自明的。我想使用java构建两个面板,一个在另一个面板上,一个在层中。我希望顶层包含一个JPanel,其中将包含一个graphics2d对象。我希望JPanel和graphics2d都有透明的背景(我仍然希望graphics2d绘制的内容可见)。有人知道怎么做吗?

在JPanel上调用setOpaque(false)——这不会绘制JPanel的背景

取决于您要覆盖的获取Graphics2D的方法(JPanel不包含像组件一样的Graphics2D对象-Graphics2D对象用于绘制JPanel)-如果它是paintComponent(),您应该-首先调用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);
    }
}

嗯,我只是用普通油漆。当我只测试一个没有graphics2d的jpanel并设置set不透明(false)时,它仍然隐藏较低的jpanel。顺便说一下,我使用的是JLayeredPane。对于Swing组件,您应该覆盖paintComponent(),而不是paint()(某些特殊情况除外)。不知道接下来该说些什么。。。因为没有代码发布,我不知道你在做什么。我将发布一个简短的例子。嗨,内特,我一直在检查是否可以在这里发送私人消息。我想用更好的方式感谢你。你的示例代码很简单,让我明白了。我正在使用我的graphics2d,注意到我正在调用clearRect,这让我经常看到一个白色屏幕。在更改此项并调整到您的代码示例后,它工作了!再次感谢,请发布您的SSCCE。我们猜不出你在干什么。