繁体   English   中英

如何设置JPanel的透明背景?

[英]How to set a transparent background of JPanel?

JPanel的背景可以设置为透明吗?

我的框架有两个JPanel

  • 图像面板
  • 功能面板

Feature PanelImage Panel重叠。 图像面板作为背景工作,它从远程 URL 加载图像。

功能面板上我想绘制形状。 由于功能面板的背景颜色,现在无法看到图像面板

我需要在绘制其形状的同时使功能面板背景透明,并且我希望图像面板可见(因为它正在执行图像的平铺和缓存功能)。

我正在使用两个JPanel ,因为我需要将图像和形状绘图分开。

重叠的 Jpanel 有没有透明背景的方法?

在上层JPanel上调用setOpaque(false)应该可以工作。

从您的评论来看,Swing 绘画可能在某处损坏了-

首先-你可能要重写paintComponent()而不是paint()中的任何组件,您有paint()重写英寸

其次 - 当您覆盖paintComponent() ,您首先要先调用super.paintComponent()来执行所有默认的 Swing 绘制内容(其中尊重setOpaque()是其中之一)。

例子 -

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class TwoPanels {
    public static void main(String[] args) {

        JPanel p = new JPanel();
        // setting layout to null so we can make panels overlap
        p.setLayout(null);

        CirclePanel topPanel = new CirclePanel();
        // drawing should be in blue
        topPanel.setForeground(Color.blue);
        // background should be black, except it's not opaque, so 
        // background will not be drawn
        topPanel.setBackground(Color.black);
        // set opaque to false - background not drawn
        topPanel.setOpaque(false);
        topPanel.setBounds(50, 50, 100, 100);
        // add topPanel - components paint in order added, 
        // so add topPanel first
        p.add(topPanel);

        CirclePanel bottomPanel = new CirclePanel();
        // drawing in green
        bottomPanel.setForeground(Color.green);
        // background in cyan
        bottomPanel.setBackground(Color.cyan);
        // and it will show this time, because opaque is true
        bottomPanel.setOpaque(true);
        bottomPanel.setBounds(30, 30, 100, 100);
        // add bottomPanel last...
        p.add(bottomPanel);

        // frame handling code...
        JFrame f = new JFrame("Two Panels");
        f.setContentPane(p);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    // Panel with a circle drawn on it.
    private static class CirclePanel extends JPanel {

        // This is Swing, so override paint*Component* - not paint
        protected void paintComponent(Graphics g) {
            // call super.paintComponent to get default Swing 
            // painting behavior (opaque honored, etc.)
            super.paintComponent(g);
            int x = 10;
            int y = 10;
            int width = getWidth() - 20;
            int height = getHeight() - 20;
            g.drawArc(x, y, width, height, 0, 360);
        }
    }
}

或者,考虑在文章如何使用根窗格中讨论的玻璃窗格 您可以在玻璃窗格的paintComponent()方法中绘制您的“功能”内容。

附录:使用GlassPaneDemo ,我添加了一个图像:

//Set up the content pane, where the "main GUI" lives.
frame.add(changeButton, BorderLayout.SOUTH);
frame.add(new JLabel(new ImageIcon("img.jpg")), BorderLayout.CENTER);

并更改了玻璃窗格的paintComponent()方法:

protected void paintComponent(Graphics g) {
    if (point != null) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setComposite(AlphaComposite.getInstance(
            AlphaComposite.SRC_OVER, 0.3f));
        g2d.setColor(Color.yellow);
        g2d.fillOval(point.x, point.y, 120, 60);
    }
}

在此处输入图片说明

如前所述这里,Swing组件必须履行的不透明财产; 在此变体中, ImageIcon完全填充了框架默认布局的BorderLayout.CENTER

在我的特殊情况下,这样做更容易:

 panel.setOpaque(true);
 panel.setBackground(new Color(0,0,0,0,)): // any color with alpha 0 (in this case the color is black
(Feature Panel).setOpaque(false);

希望这可以帮助。

要设置透明,您可以将面板的不透明设置为 false,例如

   JPanel panel = new JPanel();
   panel.setOpaque(false);

但是要使其半透明,请使用颜色属性的 alpha 属性,例如

   JPanel panel = new JPanel();
   panel.setBackground(new Color(0,0,0,125));

其中 Color 的最后一个参数用于 alpha 和 alpha 值范围在 0 到 255 之间,其中 0 是完全透明的,255 是完全不透明的

 public void paintComponent (Graphics g)
    { 
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.0f)); // draw transparent background
     super.paintComponent(g);
    ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.0f)); // turn on opacity
    g.setColor(Color.RED);
    g.fillRect(20, 20, 500, 300);
     } 

我试过这样做,但它非常闪烁

正如Thrasgod在他的回答中正确显示的那样,最好的方法是使用paintComponent,但如果情况是有一个半透明的JPanel(或任何其他组件,真的)并且里面有一些不透明的东西。 您还必须覆盖paintChildren 方法并将alfa 值设置为1。在我的情况下,我像这样扩展了JPanel:

public class TransparentJPanel extends JPanel {

private float panelAlfa;
private float childrenAlfa;

public TransparentJPanel(float panelAlfa, float childrenAlfa) {
    this.panelAlfa = panelAlfa;
    this.childrenAlfa = childrenAlfa;
}

@Override
public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(getBackground());
    g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setComposite(AlphaComposite.getInstance(
            AlphaComposite.SRC_OVER, panelAlfa));
    super.paintComponent(g2d);

}

@Override
protected void paintChildren(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(getBackground());
    g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setComposite(AlphaComposite.getInstance(
            AlphaComposite.SRC_ATOP, childrenAlfa));
  
    super.paintChildren(g); 
}
 //getter and setter
}

而在我的项目中,我只需要实例化Jpanel jp = new TransparentJPanel(0.3f, 1.0f); ,如果我只想要 Jpanel 透明。 您也可以使用g2d.fillRoundRectg2d.drawRoundRect弄乱 JPanel 形状,但这不在此问题的范围内。

暂无
暂无

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

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