Java AWT绘制Rectangle问题:为何需强制转换坐标为int?
关于AWT绘制Rectangle的问题解答
嘿,我来帮你捋清楚这个事儿!你完全没有操作错误——出现强制转换的需求,其实是AWT API设计的特性导致的。
为什么需要强制转换?
java.awt.Rectangle的getX()、getY()、getWidth()、getHeight()方法返回的是double类型,但Graphics.drawRect()方法要求的参数是int类型。这是因为AWT的底层绘图是基于整数像素的,所以必须把double值转成int才能符合方法要求。
几种更顺畅的解决方案
你看到的示例里的方案,大概率是下面这几种:
1. 直接访问Rectangle的int成员变量
java.awt.Rectangle本身就有public的int类型成员变量x、y、width、height,直接用这些就不用强制转换了:
@Override public void paint(Graphics g) { super.paint(g); // 一定要调用父类的paint方法,保证组件基础绘制正常 Rectangle r = new Rectangle(5, 5, 20, 20); g.drawRect(r.x, r.y, r.width, r.height); }
虽然现代Java不推荐直接访问public成员,但对于AWT这种老旧API来说,这是非常常见的写法。
2. 使用Graphics2D的draw(Shape)方法
如果你愿意升级到Graphics2D(它是Graphics的子类,AWT里默认就能转),可以直接传入Rectangle对象,因为Rectangle实现了Shape接口:
@Override public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g; Rectangle r = new Rectangle(5, 5, 20, 20); g2d.draw(r); }
这种方式更优雅,不需要手动处理参数类型,还能解锁更多AWT的高级绘图特性(比如抗锯齿、坐标变换)。
3. 保留你的强制转换写法
其实你最开始的写法完全没问题,只是多了点类型转换代码而已:
@Override public void paint(Graphics g) { super.paint(g); Rectangle r = new Rectangle(5, 5, 20, 20); g.drawRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(), (int) r.getHeight()); }
总的来说,你之前的操作是合法的,示例里的方案只是换了更简洁的实现方式而已~
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

