问题: //故事开始的地方 Graphics类型中的drawLine(int,int,int,int)方法不适用于参数(double,double,double,double)
g.drawLine((int)10 * xi,(int)30 * yi,(int)90 * xi,(int)30 * yi);
//其中xi是widthScale,yi是heightScale
你可以看到它很糟糕
实际原型:
public abstract void drawLine(int x1,int y1,int x2,int y2)
使用当前颜色在此图形上下文的坐标系中的点(x1,y1)和(x2,y2)之间绘制一条线。
我想做什么:
g.drawLine(double x1,double y1,double x2,double y2);
或
g.drawLine(int x1,int y1,int x2,int y2,double widthScale,double heightScale);
把我转向正确的方向然后踢我的屁股。
答案 0 :(得分:4)
不需要“扩展”图形,如果你这样做就没有用,因为Swing Graphics引擎无法生成特定类的对象。所以这就引出了一个问题 - 你从哪里获得特定的MyGraphics对象?
相反,我会使用一个形状对象,如Line2D,并使用其Line2D.Double子类型构建它,然后使用Graphics2D对象绘制它。可以通过将Graphics对象转换为此对象来获取Graphics2D对象。这对于大多数 Graphics对象是允许的,包括那些用于在JComponents和BufferedImages中绘制图像的对象。有几个地方可能不允许这样做,但我还没有遇到过这个问题。
编辑
我想知道你的问题是来自混合视图和模型。对您的问题最好的解决方案可能是让您的模型使用双精度,而视图使用整数来显示模型所拥有的数据。在将数据从模型转换为视图时,您需要进行舍入。
答案 1 :(得分:3)
您无法真正扩展Graphics,但您可以创建一个静态帮助函数来执行您需要的操作:
static void drawLine(Graphics g, double x1, double y1, double x2, double y2) {
g.drawLine(
(int)Math.round(x1), (int)Math.round(y1),
(int)Math.round(x2), (int)Math.round(y2));
}
g.drawLine((int)10*xi, (int)30*yi, (int)90*xi, (int)30*yi);
不起作用的原因是因为类型转换的优先级高于乘法。所以(int)10*xi
将10转换为int,然后将其乘以xi
,这又是一个双倍。 (int乘以double是double。)您可以通过将表达式包装在括号中来修复它:(int)(10*xi)
,但它仍然应该舍入,因此制作辅助函数是一个减少混乱的好主意。 / p>