Java 使用AWT绘制的意外圆边框

Java 使用AWT绘制的意外圆边框,java,graphics,awt,geometry,graphics2d,Java,Graphics,Awt,Geometry,Graphics2d,使用AWT,我使用java.AWT.Graphics#drawOval和java.AWT.Graphics2D#setStroke绘制边框。对于设置笔划的大小大于椭圆直径的情况,生成的边界与预期的不一样。在这种情况下,笔划与圆圈另一侧的笔划重叠:圆圈北笔划与南笔划重叠。如下图所示,AWT以异或方式渲染此重叠 相反,我希望笔划重叠是以OR的方式绘制的,因此在所有情况下,笔划宽度>圆直径时,中心都是黑色的 是否有一种简单的方法可以设置为将行为更改为重叠模式或重叠模式,即使圆形(然后是椭圆)的宽度或高

使用AWT,我使用
java.AWT.Graphics#drawOval
java.AWT.Graphics2D#setStroke
绘制边框。对于设置笔划的大小大于椭圆直径的情况,生成的边界与预期的不一样。在这种情况下,笔划与圆圈另一侧的笔划重叠:圆圈北笔划与南笔划重叠。如下图所示,AWT以异或方式渲染此重叠

相反,我希望笔划重叠是以OR的方式绘制的,因此在所有情况下,
笔划宽度>圆直径时,
中心都是黑色的

是否有一种简单的方法可以设置为将行为更改为重叠模式或重叠模式,即使圆形(然后是椭圆)的宽度或高度不相等?

随着冲程宽度的增加,相同直径(10px):


基于Marco13在评论中提到的解决方案,我提出了这个定制的
drawOval
函数。一旦笔划宽度大于直径,它基本上从
drawOval
切换到
fillOval
。计算
fillOval
函数的位置和尺寸,以匹配
drawOval
输出

public static void drawOval(Graphics2D g2d, int strokeWidth, int x, int y, int width, int height) {
    int minLength = Math.min(width, height);
    int maxLength = Math.max(width, height);
    if (minLength >= strokeWidth) {
        g2d.drawOval(x, y, width, height);
    } else {
        int x1 = x - (strokeWidth - maxLength) / 2 - (maxLength / 2);
        int y1 = y - (strokeWidth - maxLength) / 2 - (maxLength / 2);
        int width1 = width + strokeWidth;
        int height1 = height + strokeWidth;
        g2d.fillOval(x1, y1, width1, height1);
    }
}
这就是它的样子


确实出乎意料。我从未注意到这一点,将结果与
drawRect
的结果进行比较,我几乎将其视为一个bug(尽管我认为它不会被归类为bug,因为它几乎不会被忽略)。我玩了一会儿,但没有找到一个合理的解决办法。(最接近的可能是图中的草图,但应仔细检查这是否是一个合理的解决方案……)