gpt4 book ai didi

java - 为什么 Java Swing Pane 在完全放置在另一个面板上时不透明?

转载 作者:行者123 更新时间:2023-11-30 06:30:01 25 4
gpt4 key购买 nike

我有 JLayeredPane ,有两个方 block - 底部为红色,顶部为绿色(透明):

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

但是当我将绿色方 block 的边界设置为与红色方 block 相同时,通过:

greenTransparentSquare.setBounds( redSquareBounds );

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

enter image description here

这是为什么?

最佳答案

您已将 greenTransparentSquare 设置为不透明。当您执行此操作时,Swing 假定您将使用不透明的颜色绘制其边界内的每个像素。 JComponent.paintComponent 的 javadoc 对违反不透明性契约的后果有一些注释:

if this component is opaque, you must completely fill in the background in an opaque color. If you do not honor the opaque property you will likely see visual artifacts.

当绿色方 block 没有完全覆盖红色方 block 时,您看到的混合是一个伪影

当绿色方 block 完全覆盖红色方 block 时没有混合的原因是 Swing 正在优化红色方 block 的绘制 - 它根本没有被绘制,因为 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());
}
}

关于java - 为什么 Java Swing Pane 在完全放置在另一个面板上时不透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46366756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com