在屏幕上绘制一个8x8矩形变为9x9矩形?

时间:2015-05-31 12:47:50

标签: java swing graphics2d

g2.fill(new Rectangle2D.Double(0, 0, 8, 8));

这很好地填充了8x8矩形。

但是当我尝试绘制一个8x8矩形边框时会发生奇怪的事情:

g2.draw(new Rectangle2D.Double(0, 0, 8,8));

这会绘制一个9x9矩形的矩形。

enter image description here

但我指出它应该是8宽8高。

我的默认笔触宽度为1。

我忽略了什么吗?也许更好的问题是:我可以将其关闭,以便在调用draw时获得8x8矩形吗?

3 个答案:

答案 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 = 0width = 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);