Всякий раз, когда я создаю фигуру, я всегда создаю объект Path2D.Double. Затем я использую moveTo, чтобы добраться до начальной точки, и комбинацию lineTo () и curveTo (), чтобы перемещаться по пути. Затем, когда я закончу, я вызываю closePath (). Он всегда заполнен правильно.
У меня нет опыта в реализации getPathIterator, но я замечаю, что вы не делаете closePath (). Я не знаю, требуется ли это или нет, но я чувствую, что мой подход сработает.
Вот пример, который заполняет скругленный прямоугольник:
double width = 300;
double height = 400;
Path2D.Double path = new Path2D.Double();
path.moveTo(0.0, 8.0);
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0);
path.lineTo(width - 8.0, 0.0);
path.curveTo(width, 0.0, width, 8.0, width, 8.0);
path.lineTo(width, height - 8.0);
path.curveTo(width, height, width - 8.0, height, width - 8.0, height);
path.lineTo(8.0, height);
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0);
path.closePath();
g2.fill(path);