1

私の問題は次のとおりです。標準のSWINGイベントディスパッチスレッドを使用して、アルファ値が低い楕円を描画し、中央にもう1つの小さな楕円を描画してその中心を表します。また、シミュレーションを実行するときは、別のスレッドを使用し、シミュレーションの実行中にユーザーがこれらの障害物を追加できるようにします。これで、別のスレッドが実行されていないときは正常に機能しますが、別のシミュレーションスレッドが実行されているときは、大きな楕円(低いアルファで描画されるはずです)は低いアルファ値で描画されないため、ソリッドが作成されます。大きな赤い楕円形。なぜこれが起こっているのですか、どうすればこれを解決できますか?

説明がはっきりしなかった場合はお知らせください。

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

1 に答える 1

0

周りのコードがないとわかりませんが、シーンの再描画を開始する前にキャンバスを消去していないように見えます。新しいスレッドを追加するdrawObstacleCircleと、同じグラフィックスコンテキストでメソッドが複数回呼び出される可能性がありますか?

これは、メソッドがすでに描画されているシーンの上に描画することを意味します。そのため、以前に描画した楕円の代わりに、領域が赤く塗りつぶされるまで、わずかに透明な楕円が何度も何度も描画されます。

于 2012-09-24T12:05:05.773 に答える