使用drawLine扩展Graphics类(double,double,double,double)

时间:2014-02-08 16:05:29

标签: java awt

问题: //故事开始的地方 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);

把我转向正确的方向然后踢我的屁股。

2 个答案:

答案 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>