Java Graphics2D中如何为图形设置不同的描边与填充颜色?
解决Graphics2D绘制带彩色描边圆角矩形的精度问题
你遇到的描边粗细不均问题,根源在于drawRoundRect/fillRoundRect的int类型坐标限制,导致描边的像素对齐出现偏差。Java的Graphics2D没有单独的setStrokeColor()方法,但可以通过以下方式实现单形状的描边+填充,同时解决精度问题:
float thickness = textbox.getStroke(); // 创建图形状态副本,避免影响后续绘制 Graphics2D g2dTemp = (Graphics2D) g2d.create(); try { // 构建浮点精度的圆角矩形,调整位置让描边均匀分布 RoundRectangle2D.Double roundRect = new RoundRectangle2D.Double( x + thickness / 2.0, y + thickness / 2.0, xSize - thickness, ySize - thickness, round, round ); // 先填充内部区域 g2dTemp.setColor(colorsList[textbox.getColor()]); g2dTemp.fill(roundRect); // 再设置描边属性并绘制描边 g2dTemp.setStroke(new BasicStroke(thickness)); g2dTemp.setColor(colorsList[textbox.getStrokeColor()]); g2dTemp.draw(roundRect); } finally { // 释放临时图形状态,恢复原设置 g2dTemp.dispose(); }
关键说明
- 浮点精度形状:
RoundRectangle2D.Double支持双精度坐标,能避免int坐标导致的亚像素渲染偏差,解决描边上下粗细不均的问题。 - 描边位置调整:将矩形的x/y偏移
thickness/2,宽高各减去thickness,确保描边均匀环绕在填充区域的外围,不会被填充操作覆盖内部的描边像素。 - 图形状态管理:通过
g2d.create()创建临时Graphics2D对象,操作完成后dispose(),避免当前的stroke、color设置影响后续绘制,比直接重置BasicStroke(0)更安全。
如果你想简化代码,也可以使用Path2D构建形状,但核心思路都是用浮点精度坐标避免像素对齐问题,分步骤设置填充色和描边色完成绘制。
内容的提问来源于stack exchange,提问作者DefaultNano
相关产品推荐
相关产品推荐

