透明JPanel

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

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(rx, ry, r.width, r.height); super.paintComponent(g); } } 

我已经检查过,如果我将第一个面板创建更改为:

 final JPanel panel = new TransparentPanel(); 

这样做很容易:

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