g2.fill(new Rectangle2D.Double(0, 0, 8, 8));
这很好地填充了8x8矩形。
但是当我尝试绘制一个8x8矩形边框时会发生奇怪的事情:
g2.draw(new Rectangle2D.Double(0, 0, 8,8));
这会绘制一个9x9矩形的矩形。
但我指出它应该是8宽8高。
我的默认笔触宽度为1。
我忽略了什么吗?也许更好的问题是:我可以将其关闭,以便在调用draw时获得8x8矩形吗?
答案 0 :(得分:6)
Graphics2D
类的文档,在标题为“渲染兼容性问题”的部分中说:
JDK(tm)1.1渲染模型基于像素化模型 指定坐标是无限薄的,位于 像素。使用一个像素宽的笔执行绘制操作 填充下方和右侧锚点的像素 路径。 JDK 1.1呈现模型与功能一致 需要的大多数现有类平台渲染器 将整数坐标解析为必须落下的离散笔 完全按指定的像素数。
接着说:
Java 2D API保持与JDK 1.1呈现行为的兼容性, 这样传统操作和现有渲染器行为就是如此 在Java 2D API下没有改变。映射到一般绘制的遗留方法 和填充方法已定义,
基本上,这意味着如果Java呈现从(0,0)
到(0,8)
的行,它将在 0
坐标下的像素中绘制它。从(0,8)到(8,8)的行将在pixl中进入8
x坐标的右。
0┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ 1├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 2├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 3├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 4├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 5├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 6├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 7├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ │ █ │ 8├───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │ └───┴───┴───┴───┴───┴───┴───┴───┴───┘ 0 1 2 3 4 5 6 7 8
因此,在8x8矩形周围使用draw
在矩形内部绘制两条线,在其外部绘制两条线。
答案 1 :(得分:3)
drawRect
的文档告诉您Graphics2D
如何绘制矩形:
绘制指定矩形的轮廓。左右边缘 矩形的长度为x和x +宽度。顶部和底部边缘是 在y和y +高度。使用图形绘制矩形 上下文的当前颜色。
所以基本上,如果x = 0
和width = 8
,左边的行将在0
而右边的行在8
。因此,总宽度为0 ... 8
,等于8 - 0 + 1 = 9
。
如果要绘制宽度和高度均为8
的矩形,可以将其缩小一个像素:
g2.draw(new Rectangle2D.Double(0, 0, 7, 7));
答案 2 :(得分:0)
以下代码将矩形渲染两次,首先是填充,然后是边框(绘制)。这就是它的工作原理。
Rectangle2D rect = new Rectangle2D.Double(...);
g2.setColor(Color.white);
g2.fill(rect);
g2.setColor(Color.black);
g2.draw(rect);