Java 为整个JPanel设置透明颜色
我有一个JPanel和一个拥有图标图片的JLabel。 如何在整个JPanel(包括JLabel图标)顶部设置透明的红色? 我有透明的背景颜色的面板上,但我想整个面板,包括图片和一切得到这个透明的颜色。有点像一个透明的彩色玻璃放在墙上Java 为整个JPanel设置透明颜色,java,swing,jpanel,awt,transparent,Java,Swing,Jpanel,Awt,Transparent,我有一个JPanel和一个拥有图标图片的JLabel。 如何在整个JPanel(包括JLabel图标)顶部设置透明的红色? 我有透明的背景颜色的面板上,但我想整个面板,包括图片和一切得到这个透明的颜色。有点像一个透明的彩色玻璃放在墙上 import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformedURLException; impor
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TransparentJLabel {
private static final String IMAGE_PATH = "http://duke.kenai.com/Oracle/OracleStratSmall.png";
private static void createAndShowUI() {
JPanel panel = new JPanel();
panel.setBackground(Color.pink);
URL imageUrl;
try {
imageUrl = new URL(IMAGE_PATH);
BufferedImage image = ImageIO.read(imageUrl);
ImageIcon icon = new ImageIcon(image);
JLabel label = new JLabel(icon);
panel.add(label);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JFrame frame = new JFrame("TransparentJLabel");
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
如果您只需要在整个
contentPane
上安装一个分层面板,那么简单的方法就可以了(覆盖paintComponent(…)
方法)。例如:
JPanel glassPane = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
g2.setColor(new Color(0, 100, 0, 100));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
}
};
glassPane.setOpaque(false);
frame.setGlassPane(glassPane);
frame.getGlassPane().setVisible(true);
但是,如果您只希望在一个
JPanel
上有一个分层面板,我会将JLayer
与LayerUI
结合使用,正如MadProgrammer已经提到的那样。您需要一个自定义的LayerUI
,在其中覆盖paint(Graphics g,JComponent c)
方法。我知道这听起来很危险,但我真的不知道还有别的办法
我在下面提供了一个示例,这是输出:
如您所见,panel1
(或者更准确地说,JLayer
)略微透明(RGBA=“0,100,0,100”
),而panel2
是正常的
代码:
import java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
导入javax.swing.plaf.LayerUI;
公开课范例{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新例子();
}
});
}
公共示例(){
JFrame=新JFrame(“示例”);
JPanel panel1=新的JPanel();
面板1.添加(新JButton(“面板1”));
MyLayerUI layerUI=新的MyLayerUI();
JLayer panel1Layer=新JLayer(panel1,layerUI);
panel1.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
if(layerUI.hasOverlay()){
layerUI.setOverlay(false);
}否则{
layerUI.setOverlay(true);
}
panel1Layer.repaint();
}
});
JPanel panel2=新的JPanel();
面板2.添加(新JButton(“面板2”));
JPanel contentPane=newjpanel(newgridlayout(2,1));
contentPane.add(panel1Layer);
contentPane.add(panel2);
frame.setContentPane(contentPane);
框架。设置尺寸(300200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}
类MyLayerUI扩展了LayerUI{
私有布尔覆盖=true;
@凌驾
公共空隙涂料(图形g、J组件c){
超级油漆(g,c);
if(hasOverlay()){
Graphics2D g2=(Graphics2D)g.create();
g2.setColor(新颜色(0,100,0,100));
g2.fillRect(0,0,c.getWidth(),c.getHeight());
g2.dispose();
}
}
公共布尔覆盖(){
返回叠加;
}
公共void集合覆盖(布尔覆盖){
this.overlay=覆盖;
}
}
Swing组件要么完全透明,要么完全不透明。您可以通过使组件完全透明并覆盖其paintComponent
方法,并用您想要的颜色填充组件区域来进行欺骗。在这种情况下,覆盖要复杂得多。您可以考虑使用JLeal/JxLead。否则你会考虑使用一个覆盖布局管理器,你能提一下如何删除点击上的PANEL1层吗?您是要将默认参数传递给paint方法,还是用新的JPanel替换panel1Layer UI?@Mehdi是的,我认为一个布尔值指示是否应该绘制绿色区域是最好的解决方案-我更新了代码。@Mehdi等待。。。是否要删除整个面板1层
,包括按钮?如果这就是你的意思,那就看看吧。
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.plaf.LayerUI;
public class Example {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
public Example() {
JFrame frame = new JFrame("Example");
JPanel panel1 = new JPanel();
panel1.add(new JButton("Panel 1"));
MyLayerUI layerUI = new MyLayerUI();
JLayer<JPanel> panel1Layer = new JLayer<JPanel>(panel1, layerUI);
panel1.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (layerUI.hasOverlay()) {
layerUI.setOverlay(false);
} else {
layerUI.setOverlay(true);
}
panel1Layer.repaint();
}
});
JPanel panel2 = new JPanel();
panel2.add(new JButton("Panel 2"));
JPanel contentPane = new JPanel(new GridLayout(2, 1));
contentPane.add(panel1Layer);
contentPane.add(panel2);
frame.setContentPane(contentPane);
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MyLayerUI extends LayerUI<JPanel> {
private boolean overlay = true;
@Override
public void paint(Graphics g, JComponent c) {
super.paint(g, c);
if (hasOverlay()) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setColor(new Color(0, 100, 0, 100));
g2.fillRect(0, 0, c.getWidth(), c.getHeight());
g2.dispose();
}
}
public boolean hasOverlay() {
return overlay;
}
public void setOverlay(boolean overlay) {
this.overlay = overlay;
}
}