透明JPanel

时间:2012-04-07 22:54:05

标签: java swing jframe

我想创建一个半透明的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);
    }
}

2 个答案:

答案 0 :(得分:20)

JPanel不支持半透明背景。处理此问题需要两个步骤:

  • 首先,要获得任何功能正常的透明度,您必须 setOpaque(false)在面板上;否则你会有毛刺,因为假设一个不透明的面板完全覆盖其边界下面的东西。

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

    < / LI>

这是一个替代课程,它将负责这两个步骤。

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();

答案 1 :(得分:5)

这样做很容易:

// 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)

请参阅: fiddle http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html