0

我在 Java 中遇到了一个非常奇怪的行为/问题。我所做的归结为在画布上绘制简单的形状。一切都很顺利,直到我决定添加另一个可以访问我的画布的线程。

所以有两个线程,每个都绘制相似的形状,并且每个都依赖相同的函数(在另一个非线程对象中)来进行绘制。这些函数已同步化,以防止底层绘制命令被乱序调用。

一切都很好,除非我将线程#2 的绘图函数调用的颜色设置为包含 alpha 通道。当我这样做时,我得到以下异常:

Exception in thread "Thread-3" java.awt.geom.IllegalPathStateException: missing initial moveto in path definition
    at java.awt.geom.Path2D$Float.needRoom(Unknown Source)
    at java.awt.geom.Path2D.closePath(Unknown Source)
    at sun.java2d.pipe.PixelToShapeConverter.makePoly(Unknown Source)
    at sun.java2d.pipe.PixelToShapeConverter.fillPolygon(Unknown Source)
    at sun.java2d.pipe.ValidatePipe.fillPolygon(Unknown Source)
    at sun.java2d.SunGraphics2D.fillPolygon(Unknown Source)
    at java.awt.Graphics.fillPolygon(Unknown Source)
    at com.deadbird.zndo.Tile.drawPolygon(Tile.java:177)
    at com.deadbird.zndo.TiledImage.drawPolygon(TiledImage.java:158)
    at com.deadbird.zndo.TileSet.drawPolygon(TileSet.java:46)
    at com.deadbird.zndo.Map.drawPolygonAtCoords(Map.java:90)
    at com.deadbird.zndo.CutterThread.drawArea(CutterThread.java:146)
    at com.deadbird.zndo.CutterThread.flushTmpAreaList(CutterThread.java:107)
    at com.deadbird.zndo.CutterThread.cut(CutterThread.java:68)
    at com.deadbird.zndo.CutterThread.run(CutterThread.java:50)
    at java.lang.Thread.run(Unknown Source)

让我丧命的是,这个错误似乎表明我提供给它的几何图形有问题,我知道这不是真的,当我运行相同的代码、相同的几何图形、只是使用不包含的颜色对象时alpha 值程序运行得很好,轻松地处理大量数据,并且绘图函数根本没有显示两个线程有​​问题的迹象。

还值得注意的是,线程#1 在颜色对象中使用 alpha 值调用相同的绘制函数没有问题,这些结果绘制得很好。

所以我的问题是,什么可能导致这种差异?相同的功能,两个线程,一个可以很好地绘制 alpha 和非 alpha 颜色,另一个似乎只适用于非 alpha。

这是有问题的功能:

public synchronized void drawPolygon(double[] x, double[] y, Color color) {

    // Create polygon
    int[] intX = new int[x.length];
    int[] intY = new int[y.length];

    // Convert the double array to an int array
    for (int i=0; i < intX.length; i++) {
        intX[i] = (int) x[i]; 
        intY[i] = (int) y[i]; 
    }

    Polygon poly = new Polygon(intX, intY, intX.length);

    // Now draw that poly
    g.setColor(color);
    g.fillPolygon(poly);

}

更具体地说明导致问题的原因,这有效:

drawPolygon(x, y, new Color(13, 191, 0) );

这不...

drawPolygon(x, y, new Color(13, 191, 0, 30) );

这很有趣,因为我没有给它一个形状对象,而是给它一组静态的 X 和 Y 值,然后让 Java 将它们组装成一个多边形对象。无论路径形成是什么,它都应该由多边形的对象正确处理(并且在我引入新线程之前它工作得很好,我不认为这是这里的问题)。

这真的看起来像是一个内部问题,有什么想法吗?

-科迪

4

1 回答 1

0

好的,所以我想通了。

我试图通过在我的“剪切”线程(导致问题的线程)中使用行迭代器将其分解来绘制区域(java.awt.geom.Area)。绘制区域的正确方法是使用 Graphics2D 的填充方法而不是 fillPolygon。填充可以绘制任何形状对象,包括区域。

-科迪

于 2012-09-16T02:05:14.867 回答