Java 爪哇语;路径定义中缺少初始moveto“;将alpha添加到颜色之后
我在Java中遇到了一个非常奇怪的行为/问题。我所做的可以归结为在画布上绘制简单的形状。一切都很顺利,直到我决定添加另一个线程,可以访问我的画布 因此有两个线程,每个线程绘制相似的形状,每个线程依赖相同的函数(在另一个非线程对象中)来绘制。这些函数是同步的,以保护底层draw命令不被无序调用 一切都很好,除了我将thread#2的绘图函数调用的颜色设置为包含alpha通道。当我这样做时,我会得到以下异常:Java 爪哇语;路径定义中缺少初始moveto“;将alpha添加到颜色之后,java,path,definition,Java,Path,Definition,我在Java中遇到了一个非常奇怪的行为/问题。我所做的可以归结为在画布上绘制简单的形状。一切都很顺利,直到我决定添加另一个线程,可以访问我的画布 因此有两个线程,每个线程绘制相似的形状,每个线程依赖相同的函数(在另一个非线程对象中)来绘制。这些函数是同步的,以保护底层draw命令不被无序调用 一切都很好,除了我将thread#2的绘图函数调用的颜色设置为包含alpha通道。当我这样做时,我会得到以下异常: Exception in thread "Thread-3" java.awt.geom.
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, 30) );
这很有趣,因为我没有给它一个shape对象,而是给它一组静态的X和Y值,让Java将它们组装成一个多边形对象。无论进行什么路径形成,都应该由多边形的对象正确处理(在我引入新线程之前,它工作得很好,我不认为这是这里的问题)
这看起来确实是个内部问题,有什么想法吗
-科迪好吧,我想出来了 我试图通过在我的“Cut”线程(导致问题的线程)中使用线迭代器将其分解来绘制一个区域(java.awt.geom.Area)。绘制区域的正确方法是使用Graphics2D的填充方法,而不是使用fillPolygon。填充可以绘制任何形状对象,包括一个区域
-Cody您从哪里知道同时使用相同的图形上下文是安全的?哪行代码导致了您的问题?您是否注意只对一个事件线程进行这种类型的调用?冒着问一个极其愚蠢的问题的风险,为什么重用图形上下文是一件坏事?值得注意的是,所有的绘图都是对BuffereImage进行的,然后将其绘制到我的画布上。我有创建画布的常规线程(我称之为main)和两个任务线程,这两个线程都调用画布对象的draw函数。我假设canvas对象正在使用事件线程,但是我承认我并不完全理解这个过程。哦,哇,我明白了。重用图形上下文可能还可以,但在并发情况下,这显然不是一个好主意。让我重写这个函数,每次创建一个新的图形上下文,看看会发生什么。
drawPolygon(x, y, new Color(13, 191, 0, 30) );