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

Tin*_*Sky 2 java swing graphics2d

g2.fill(new Rectangle2D.Double(0, 0, 8, 8));
Run Code Online (Sandbox Code Playgroud)

这很好地填充了一个8x8的矩形.

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

g2.draw(new Rectangle2D.Double(0, 0, 8,8));
Run Code Online (Sandbox Code Playgroud)

这将绘制一个9x9矩形矩形.

在此输入图像描述

但我指出它应该是8宽和8高.

我的默认笔划宽度为1.

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

Rea*_*tic 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转到正确的的8x坐标.

0?????????????????????????????????????
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
2?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
3?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
4?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
5?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
6?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
7?????????????????????????????????????
 ? ? ?   ?   ?   ?   ?   ?   ?   ? ? ?
8?????????????????????????????????????
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 ?????????????????????????????????????
 0   1   2   3   4   5   6   7   8      

因此,使用draw8x8左右的矩形在矩形内部绘制两条线,在其外部绘制两条线.