首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPanels中显示为黑色的java swing部分透明度

JPanels中显示为黑色的java swing部分透明度
EN

Stack Overflow用户
提问于 2016-08-15 03:36:34
回答 2查看 187关注 0票数 1

我正在尝试创建一个带有“子”JPanels的基本JPanel,其中有显示基本JPanel背景的透明矩形。我似乎只能在我的孩子和基础JPanel中创建透明矩形。有没有办法让java只在基础JPanel上绘制子JPanels的不透明部分,而忽略透明部分?

简而言之,我希望图片中的黑色矩形是青色(基础JPanel的背景色)。

一张JFrame的照片

代码语言:javascript
复制
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.beans.Transient;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;


public class Showcase extends JFrame{

    public static void main(String[] args) {
        Showcase window = new Showcase();
    }

    public Showcase() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel contentPane = new JPanel();
        contentPane.setBackground(Color.CYAN);
        setContentPane(contentPane);


        final TestPane tP = new TestPane();
        contentPane.add(tP);
        tP.setBackground(Color.BLUE);

        setVisible(true);
        pack();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 300);
    }

    public class TestPane extends JPanel{

        @Override
        protected void paintComponent(Graphics g) {         
            super.paintComponent(g);        
            Graphics2D g2 = (Graphics2D) g;
            g2.setBackground(new Color(0, 0, 0, 0));

            g2.clearRect(0, 0, 50,50);
            g2.dispose();
        }

        @Override
        @Transient
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-08-15 05:33:37

有没有办法让java只绘制不透明的部分?

首先,您需要将面板设置为非不透明,以便绘制父背景。

然后,您可以使用Area类创建要绘制的Shape

代码语言:javascript
复制
public class TestPane extends JPanel
{
    public TestPane()
    {
        setOpaque( false ); // to make it transparent.
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
/*
        Graphics2D g2 = (Graphics2D) g;
        g2.setBackground(new Color(0, 0, 0, 0));

        g2.clearRect(0, 0, 50,50);
        g2.dispose();
*/
        Graphics2D g2d = (Graphics2D) g.create();

        Shape outer = new Rectangle(0, 0, getWidth(), getHeight());
        Shape inner = new Rectangle(0, 0, 50, 50);
        Area area = new Area( outer );
        area.subtract( new Area(inner) );

        g2d.setColor( getBackground() );
        g2d.fill(area);
        g2d.dispose();
    }

    @Override
    @Transient
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-08-15 04:35:36

您可以使用setOpaque()使JPanel的背景透明,但是不能在您想要使其透明的矩形上绘制。

因此,另一种方法是创建一个BufferedImage并在该图像上绘制矩形,然后将该BufferedImage添加到JPanel中。

代码语言:javascript
复制
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.beans.Transient;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;


public class Showcase extends JFrame {

    BufferedImage img;

    public static void main(String[] args) {
        Showcase window = new Showcase();
    }

    public Showcase() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel contentPane = new JPanel();
        contentPane.setBackground(Color.CYAN);
        setContentPane(contentPane);


        final TestPane tP = new TestPane();
        contentPane.add(tP);

        // make new buffered image
        img = new BufferedImage(tP.getPreferredSize().width, 
                tP.getPreferredSize().height, BufferedImage.TYPE_INT_ARGB);

        setVisible(true);
        pack();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 300);
    }

    public class TestPane extends JPanel{

        @Override
        protected void paintComponent(Graphics g) {              
            Graphics2D g2 = (Graphics2D) g;

            Graphics2D imgG2 = img.createGraphics();

            // make img background transparent
            imgG2.setBackground(new Color(0,0,0,0));

            imgG2.setColor(Color.red);
            imgG2.fillRect(0, 0, 100, 100);

            imgG2.clearRect(0, 0, 50, 50);

            imgG2.dispose();

            // draw buffered image to jpanel
            g2.drawImage(img, 0, 0, null);

            g2.dispose();

            super.paintComponent(g);   
        }

        @Override
        @Transient
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }
    }
}

最终结果将如下所示:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38945879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档