透明JPanel

Posted

技术标签:

【中文标题】透明JPanel【英文标题】:Transparent JPanel 【发布时间】:2012-04-20 23:43:30 【问题描述】:

我想创建一个半透明的 JPanel。我通过简单地使用颜色构造函数的 RGBA 值来完成它,但问题是当我使用事件处理时无法正常工作。我的要求是一个半透明的 Jpanel,当鼠标进入它时,这个面板的边框变得可见,如果鼠标退出,边框应该不可见。我已经通过以下代码做到了这一点,但问题是它不适用于透明背景(RGBA),但它适用于 RGB 颜色。

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class MDCW extends JFrame 

      private JPanel contentPane;

     /**
     * Launch the application.
     */
     public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                try 
                    MDCW frame = new MDCW();
                    frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     */
    public MDCW() 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1013, 551);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(0, 139, 139));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        final JPanel panel = new JPanel();

        panel.setBackground(new Color(0, 0, 0,50));
        panel.addMouseListener(new MouseAdapter() 
            @Override
            public void mouseEntered(MouseEvent e) 
                panel.setBorder(new LineBorder(new Color(255, 255, 255), 5));   
            
            @Override
            public void mouseExited(MouseEvent e) 
                panel.setBorder(null);  
            
        );
        panel.setBounds(360, 155, 215, 215);
        contentPane.add(panel);

        final JPanel panel_1 = new JPanel();
        panel_1.setBackground(new Color(0, 0, 0));
        panel_1.addMouseListener(new MouseAdapter() 
            @Override
            public void mouseEntered(MouseEvent e) 
                panel_1.setBorder(new LineBorder(new Color(255, 255, 255), 5)); 
            
            @Override
            public void mouseExited(MouseEvent e) 
                panel_1.setBorder(null);    
            
        );
        panel_1.setBounds(84, 155, 215, 215);
        contentPane.add(panel_1);
    

【问题讨论】:

【参考方案1】:

JPanel 不支持半透明背景。解决这个问题需要两个步骤:

首先,要获得任何正常运行的透明度,您必须在面板上setOpaque(false);否则会出现故障,因为假定不透明的面板完全覆盖了其边界之下的内容。

但是,当opaquefalse 时,面板也根本不绘制其背景(!),因此您必须在paintComponent 中绘制背景。

这是一个替换类,它将处理这两个步骤。

private class TransparentPanel extends JPanel 
    
        setOpaque(false);
    
    public void paintComponent(Graphics g) 
        g.setColor(getBackground());
        Rectangle r = g.getClipBounds();
        g.fillRect(r.x, r.y, r.width, r.height);
        super.paintComponent(g);
    

如果我将第一个面板创建更改为:

final JPanel panel = new TransparentPanel();

【讨论】:

在找到这个之前必须搜索过我们的 2 个!为什么哦,为什么 jpanel 不能像 JFrame 这样的 setOpacity 方法? @AdamHughes ***.com/a/2452381/3560873 因为你的问题的答案有点复杂和超载。【参考方案2】:

这样做很容易:

// initialise JPanel 
JPanel somePanel = new JPanel(new GridBagLayout());
somePanel.setBackground(new Color(0,0,0,x);

在这种情况下,x 是您正在寻找的透明度级别 0 是不可见的,100 是实心的。

例如:

somePanel.setBackground(new Color(0,0,0,55)

见: http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html

【讨论】:

实际上无论如何都不是那么容易做到的。 调整窗口大小后,它不再工作了!

以上是关于透明JPanel的主要内容,如果未能解决你的问题,请参考以下文章

第十二周总结

第十二周

第十二周总结

第十二周课程总结

需要帮助访问内部类中的变量for循环

第十二周课程总结