假设我想让一个JPanel的不透明度变为20%可见?我不是指设置setOpaque(绘制或不绘制)或setVisible(显示或隐藏)......我的意思是使其成为半透明的JPanel..你知道吗?
这个可能吗?
假设我想让一个JPanel的不透明度变为20%可见?我不是指设置setOpaque(绘制或不绘制)或setVisible(显示或隐藏)......我的意思是使其成为半透明的JPanel..你知道吗?
这个可能吗?
panel.setBackground( new Color(r, g, b, a) );
然而,即使如此,这仍然无法正常工作,因为 Swing 无法正确地绘制透明背景,所以您需要进行自定义绘制。基本逻辑是:
JPanel panel = new JPanel()
{
protected void paintComponent(Graphics g)
{
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
};
panel.setOpaque(false); // background of parent will be painted first
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);
请查看使用透明度的背景了解实际绘画问题及上述代码为何解决该问题的更多信息。该链接还包含一个可重复使用的自定义类,可以为您执行上述绘画操作。
panel.setBackground(new Color(0,0,0,64));
将创建一个带64透明度的黑色。
结果如下图所示:
以下是代码
package test;
import javax.swing.*;
import java.awt.Color;
import java.awt.BorderLayout;
public class See {
public static void main( String [] args ){
JFrame frame = new JFrame();
frame.setBackground( Color.orange );
frame.add( new JPanel(){{
add( new JLabel("Center"));
setBackground(new Color(0,0,0,64));
}} , BorderLayout.CENTER );
frame.add( new JLabel("North"), BorderLayout.NORTH);
frame.add( new JLabel("South"), BorderLayout.SOUTH);
frame.pack();
frame.setVisible( true );
}
}
没有它,它看起来像这样:
setBackground( new Color( 0,0,0 ) ); // or setBackground( Color.black );
AWTUtilities.setWindowOpacity(aWindow, aFloat);
其中aWindow是Swing组件,aFloat是不透明度。
在Windows 7上它的表现不是很好。
panel.setBackground( new Color(r, g, b, a) );
Alpha通道只是让颜色变亮。
当一个带有Alpha通道的颜色元素被更新时,计算机会感到困惑,并重置没有Alpha通道的更新元素的背景。我要尝试一下。
AWTUtilities.setWindowOpacity(aWindow, aFloat);
下一个。
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g2d = (Graphics2D) graphics;
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
}