Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Graphics2D对象为同一对象以不同方式渲染透明度_Java - Fatal编程技术网

Java Graphics2D对象为同一对象以不同方式渲染透明度

Java Graphics2D对象为同一对象以不同方式渲染透明度,java,Java,我的问题如下。我正在使用标准的SWING事件分派线程绘制一个具有低alpha值的椭圆形,并在中心绘制另一个较小的椭圆形以表示其中心。当我运行模拟时,我使用一个单独的线程,还允许用户在模拟运行时添加这些障碍物。现在,当单独的线程未运行时,这可以正常工作,但当单独的模拟线程运行时,应该使用低alpha绘制的较大椭圆不会使用低alpha值绘制,因此会创建一个实心的大红色椭圆。为什么会发生这种情况?我如何解决 如果我解释得不太清楚,请告诉我 private void drawObstacleCircle

我的问题如下。我正在使用标准的SWING事件分派线程绘制一个具有低alpha值的椭圆形,并在中心绘制另一个较小的椭圆形以表示其中心。当我运行模拟时,我使用一个单独的线程,还允许用户在模拟运行时添加这些障碍物。现在,当单独的线程未运行时,这可以正常工作,但当单独的模拟线程运行时,应该使用低alpha绘制的较大椭圆不会使用低alpha值绘制,因此会创建一个实心的大红色椭圆。为什么会发生这种情况?我如何解决

如果我解释得不太清楚,请告诉我

private void drawObstacleCircle(Obstacle o, Graphics2D g)
{
    final double OBSTACLE_CENTER_RADIUS = 2.0;
    final double OBSTACLE_RADIUS = o.getRadius(true);

    float scaleToUse = Math.max(0.8f, scale);

    Vector pos = o.getPosition();

    int xPos = (int) (pos.getX() * getBufferedHeightMap().getWidth());
    int yPos = (int) (pos.getY() * getBufferedHeightMap().getHeight());

    Point positionPoint = convertToPanelPoint(new Point(xPos, yPos));

    // Draw the circle where the Obstacle's center is
    Graphics2D g1 = (Graphics2D) g.create();

    g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g1.setColor(Color.RED);
    g1.fillOval(positionPoint.x - (int) (OBSTACLE_CENTER_RADIUS * scaleToUse), positionPoint.y - (int) (OBSTACLE_CENTER_RADIUS * scaleToUse), (int) (OBSTACLE_CENTER_RADIUS * 2 * scaleToUse), (int) (OBSTACLE_CENTER_RADIUS * 2 * scaleToUse));

    Color c = Color.RED;
    g1.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 100));
    g1.fillOval(positionPoint.x - (int) (OBSTACLE_RADIUS * scaleToUse), positionPoint.y - (int) (OBSTACLE_RADIUS * scaleToUse), (int) (OBSTACLE_RADIUS * 2 * scaleToUse), (int) (OBSTACLE_RADIUS * 2 * scaleToUse));

    g1.dispose();
    g2.dispose();
}

如果周围没有代码,很难说清楚,但在我看来,在开始重画场景之前,你似乎没有擦除画布。添加新线程是否会导致使用相同的图形上下文多次调用drawObstacleCircle方法


这意味着该方法将在已绘制场景的顶部绘制。因此,一次又一次地在先前绘制的椭圆的位置上绘制一个略微透明的椭圆,直到该区域显示为纯红色。

非常感谢您的建议,我在代码中找到了多次添加的地方。当做