我的问题如下。我使用标准的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();
}
答案 0 :(得分:0)
如果没有围绕它的代码很难分辨,但在我开始重绘场景之前,我似乎并没有删除你的画布。是否可以添加新线程导致drawObstacleCircle
方法使用相同的图形上下文多次调用?
这意味着该方法在已绘制的场景之上绘制。因此,在先前绘制的椭圆形位置上,一次又一次地绘制一个略微透明的椭圆形,直到该区域看起来呈现红色。