透明的JPanel

14

我想要创建一个半透明的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个回答

26

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方法呢? - Adam Hughes
2
@AdamHughes 因为你的问题的答案有点复杂和过载,可以参考这个链接:https://dev59.com/qXE95IYBdhLWcg3wHqIV#2452381。 - searchengine27

6

这并不是一件容易的事情。 - Hesein Burg
调整了窗口大小之后,它不再起作用了! - Adam Taras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接