2012-09-24 79 views
1

我的問題如下。我正在使用標準的SWING事件調度線程繪製一個低alpha值的橢圓形和另一個較小的橢圓形來表示它的中心。當我運行模擬時,我使用一個單獨的線程,並允許用戶在模擬運行時添加這些障礙物。現在,當單獨的線程不運行時,但單獨的模擬線程正在運行時,工作正常,較大的橢圓(應該用低alpha值繪製)不會用低alpha值繪製,因此會創建一個固體大紅色的橢圓形。爲什麼會發生這種情況,我該如何解決這個問題?Graphics2D對象呈現透明度對於同一個對象不同

如果我在我的解釋中不太清楚,請告訴我。

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

很難說沒有它周圍的代碼,但它似乎對我來說,你是不是擦除畫布開始重繪現場。添加新線程是否會導致drawObstacleCircle方法在同一圖形上下文中被多次調用?

這將意味着該方法將繪製在已經繪製的場景之上。因此,在先前繪製的橢圓形的位置上一次又一次繪製稍微透明的橢圓形,直到該區域看起來爲紅色。

+0

非常感謝您的建議,在我的代碼中找到了我多次添加的地方。問候 –