Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇语;路径定义中缺少初始moveto“;将alpha添加到颜色之后_Java_Path_Definition - Fatal编程技术网

Java 爪哇语;路径定义中缺少初始moveto“;将alpha添加到颜色之后

Java 爪哇语;路径定义中缺少初始moveto“;将alpha添加到颜色之后,java,path,definition,Java,Path,Definition,我在Java中遇到了一个非常奇怪的行为/问题。我所做的可以归结为在画布上绘制简单的形状。一切都很顺利,直到我决定添加另一个线程,可以访问我的画布 因此有两个线程,每个线程绘制相似的形状,每个线程依赖相同的函数(在另一个非线程对象中)来绘制。这些函数是同步的,以保护底层draw命令不被无序调用 一切都很好,除了我将thread#2的绘图函数调用的颜色设置为包含alpha通道。当我这样做时,我会得到以下异常: Exception in thread "Thread-3" java.awt.geom.

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

因此有两个线程,每个线程绘制相似的形状,每个线程依赖相同的函数(在另一个非线程对象中)来绘制。这些函数是同步的,以保护底层draw命令不被无序调用

一切都很好,除了我将thread#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, 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) );