うーん、正確には

> Shapeに対して一回り大きいShapeが作られて
> そこから元のShapeを取り除いた領域に対してfillが行われる

っていうのもちょっと違うんだけどね。
まあ要するにg.draw(shape)するには
shape.getBounds()では狭すぎる、っていうことです。