Как объяснено на Обучение Java 2D, часть 1 :
java.awt.BasicStroke.CAP_ROUND
: это делает круглую крышку с центром в конечной точке с диаметром ширины пера.
Ключевое слово "по центру". Я считаю, что это всегда тот случай, когда при рисовании толстыми штрихами Java2D будет центрировать толщину линии вдоль гипотетической, бесконечно малой тонкой линии между центрами пикселей в начальной и конечной координатах. Например, при рисовании вертикальной синей линии толщиной 7 пикселей Java2D рисует по 3 пикселя с каждой стороны отрисовываемого гипотетического сегмента.
В вашем примере толщина составляет 5 пикселей. Вам необходимо сместить координаты, чтобы полностью нарисовать обводку в графическом клипе. При перемещении в 2 пикселя (или THICKNESS/2
) закругленные углы становятся видимыми:
//...
g2.setStroke(new BasicStroke(THICKNESS, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.drawRect(x + THICKNESS/2, y + THICKNESS/2, width - 2*(THICKNESS/2) - 1, height - 2*(THICKNESS/2) - 1);
g2.dispose();
}
@Override
public Insets getBorderInsets(Component c) {
return new Insets(THICKNESS + THICKNESS/2, THICKNESS + THICKNESS/2, THICKNESS + THICKNESS/2, THICKNESS + THICKNESS/2);
}
//...