2

我注意到当我用 Color(0,0,0,0) 画一些东西时,它在另一个图像上,显示的颜色是 JFrame 背景,而不是它下面的图像。

帮助我找到解决方案的原因?

谢谢!!

编辑:看圆圈,灰色区域(角)应该是透明的,但不是,相反,它们是 JFrame 的颜色。 替代文字 http://img72.imageshack.us/img72/9657/transparency.png

这是绘制圆圈的代码:

公共无效油漆(最终图形g){
        super.paintComponent(g);
        最终的 Graphics2D g2 = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        if (unitImage == null) {

            unitImage = (BufferedImage) (createImage(30, 30));
            final Graphics2D gc = unitImage.createGraphics();
            gc.setRenderingHints(rh);
            gc.setColor(outsideColor);
            gc.fillOval(0, 0, 直径, 直径);
            gc.setColor(middleColor);
            gc.fillOval(直径/6,直径/6,(直径/3)*2,(直径/3)*2);
            gc.setColor(innerColor);
            gc.fillOval(直径/3,直径/3,直径/3,直径/3);
        }

        g2.drawImage(unitImage, null, 0, 0);

一直在玩 Alphacomposites,我认为这不是解决方案。所以我添加了所有这些我相信的新信息,这将帮助你们给我另一个提示。

4

3 回答 3

7

你在绘制之前设置了 AlphaComposite 吗?

Graphics2D g2d = (Graphics2D)g; //Some graphics object
//Save the original
Composite original = g2d.getComposite();
//Set to semi translucent
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
g2d.setComposite(translucent);

//Draw

//Set back to original
g2d.setComposite(original);

免责声明:代码注释已测试

于 2010-04-15T03:46:24.257 回答
6

@Chuk Lee 是对的:除非您更改它,否则默认Graphics2D组合是AlphaComposite.SrcOver. 这个方便的工具显示选定规则和指定颜色和 alpha 对的合成结果。

附录:一种方法是覆盖paintComponent()和渲染地图和圆圈,但您可以通过清除 alpha 使角透明:

...
gc.setRenderingHints(rh);
gc.setComposite(AlphaComposite.Clear);
gc.fillRect(0, 0, diameter, diameter);
gc.setComposite(AlphaComposite.Src);
gc.setColor(outsideColor);
...

createImage(30, 30)关系diameter吗?您覆盖paint()和调用哪个组件super.paintComponent(g)

于 2010-04-15T04:38:29.737 回答
2

您正在使用 0 的不透明度进行绘画。如果您想要黑色,请使用 Color(0,0,0,255)。

更新

对不起,我误解了你的问题。阅读了您添加到帖子中的代码后,我假设小目标是放置在绘制在父组件上的地图顶部的组件。

为了确保使用透明度,您需要两件事:

  1. 你需要在目标组件的构造函数中调用 setOpaque(false)
  2. 要么直接绘制目标而不使用后备存储,要么使用 RGBA 图像:

    unitImage = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);

于 2010-04-15T05:54:09.913 回答