为什么Java Swing窗格在完全放在另一个面板上时不透明?

时间:2017-09-22 14:09:14

标签: java swing

我有JLayeredPane有两个正方形 - 底部是红色,顶部是绿色(透明):

enter image description here

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 );

似乎完全覆盖了,透明度不再起作用了:

enter image description here

为什么?

1 个答案:

答案 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());
    }
}