透明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)
;否则会出现故障,因为假定不透明的面板完全覆盖了其边界之下的内容。
但是,当opaque
为false
时,面板也根本不绘制其背景(!),因此您必须在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的主要内容,如果未能解决你的问题,请参考以下文章