Почему метод рисования Graphics не учитывает атрибуты обводки?
Вопрос
Я хочу создать настраиваемую границу с закругленными углами.
Код -
родовое словоРезультат -
Как видите, Graphics.drawRect
полностью игнорирует атрибуты BasicStroke.CAP_ROUND
и BasicStroke.JOIN_ROUND
.Почему?
Решение
Как описано в Изучение Java 2D, часть 1 :
<цитата> java.awt.BasicStroke.CAP_ROUND
: создает круговой колпачок с центром в конечной точке с диаметром, равным ширине пера.
Ключевое слово - «по центру». Я считаю, что всегда бывает так, что при рисовании толстыми штрихами Java2D центрирует толщину линии вдоль гипотетической бесконечно тонкой линии между центрами пикселей в начальной и конечной координатах. Например, при рисовании вертикальной синей линии толщиной 7 пикселей Java2D рисует по 3 пикселя с каждой стороны отрисовываемого гипотетического сегмента линии.
В вашем примере толщина составляет 5 пикселей. Вам нужно сместить координаты, чтобы полностью нарисовать обводку внутри графического клипа. При перемещении на 2 пикселя (или сгенерированном коде кода) закругленные углы становятся видимыми:
родовое слово
Другие советы
проблема заключается в смещении: вы фактически обрезаете границу посередине, чтобы углы не выглядели закругленными.Принимая это во внимание (здесь только для смещения, необходимо также настроить ширину)
родовое слово< sizesЭдит
исправлен неряшливый подсчет пикселей :-)