我有JLayeredPane
有两个正方形 - 底部是红色,顶部是绿色(透明):
public LayeredPaneDemo( )
{
final JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setPreferredSize( new Dimension( 200, 160 ) );
final Rectangle redSquareBounds = new Rectangle( 0, 0, 140, 140 );
final Rectangle greenSquareBounds = new Rectangle( 50, 0, 140, 140 );
final JLabel redSquare = new JLabel();
redSquare.setOpaque( true );
redSquare.setBackground( Color.RED );
redSquare.setBounds( redSquareBounds );
layeredPane.add( redSquare, JLayeredPane.DEFAULT_LAYER );
final JLabel greenTransparentSquare = new JLabel();
greenTransparentSquare.setOpaque( true );
greenTransparentSquare.setBackground( new Color( 0f, 1f, 0f, .5f ) );
greenTransparentSquare.setBounds( greenSquareBounds );
layeredPane.add( greenTransparentSquare, JLayeredPane.MODAL_LAYER );
this.add( layeredPane );
}
private static void createAndShowGUI()
{
final JFrame frame = new JFrame( "LayeredPaneDemo" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
final JComponent newContentPane = new LayeredPaneDemo();
newContentPane.setOpaque( true );
frame.setContentPane( newContentPane );
frame.pack();
frame.setVisible( true );
}
public static void main( final String[] args )
{
javax.swing.SwingUtilities.invokeLater( LayeredPaneDemo::createAndShowGUI );
}
但是当我设置绿色正方形与红色正方形绑定时,通过:
greenTransparentSquare.setBounds( redSquareBounds );
似乎完全覆盖了,透明度不再起作用了:
为什么?
答案 0 :(得分:1)
您已将greenTransparentSquare
设为opaque
。执行此操作时,Swing假定您将使用非透明颜色绘制其边界内的每个像素。来自JComponent.paintComponent
的javadoc对违反不透明合同的后果有一些注意事项:
如果此组件不透明,则必须完全填写背景 不透明的颜色。如果您不尊重不透明的财产 可能会看到视觉文物。
当绿色方块未完全覆盖红色方块时,您看到的混合是工件。
绿色正方形完全覆盖红色正方形时没有混合的原因是Swing正在优化红色正方形的绘制 - 它根本没有被绘制,因为Swing认为它完全被遮挡了。
简单地将JLabel
设置为透明将无法获得您想要的效果,因为opaque
标志为false
时忽略背景颜色(请参阅JComponent.setBackground
的javadoc用于备注)。您必须创建自己的组件并进行自定义渲染:
public static class JSquare extends JComponent {
@Override
public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
}