用Java绘制对角线

时间:2014-10-27 10:43:19

标签: java swing drawing line stroke

我有以下代码:

private _x,_y,_w,_h;
protected void paintComponent( Graphics g_ ) {
  g_.setStroke( new BasicStroke(2) );

  g_.drawLine(_x, _y, _x+_w, _y+_h);
  g_.drawLine(_x, _y+_h, _x+_w, _y);
}

在我的情况下,我正在画一个正方形的对角线,所以:_w==_h

我的问题是两条线没有相同的明显特征:第一条线看起来比第二条线厚。当检查这里绘制的实际像素时,渲染的差异是:

Stroke 2px

我真的不在乎哪一个应该被认为是“正确的”(虽然我想了解这个结果的原因),但我想在这里有一些连贯性,两条线都有相同的渲染:如何我能这样做吗?

(当我使用1px笔划时,两条线之间没有区别)。

跟随Olavi's ansewer:

使用奇数个像素进行描边无法解决问题:

Stroke 3px

启用消除锯齿导致另一个问题:绘制十字的方块的笔划变得模糊:

Stroke 2px + antialiasing

1 个答案:

答案 0 :(得分:5)

基本上你有两个选择:

  1. 使用奇数厚度
  2. 使用抗锯齿
  3. 我个人更喜欢抗锯齿,因为它很漂亮,我喜欢漂亮的东西。然而,要解释为什么2的笔划宽度表现得如此:Java不知道是否以第一种方式或第二种方式绘制线条(我无法确切地解释它为什么会这样做,但这是什么我知道了)。为了进一步详细说明这个答案,尝试向左或向右开始另一行一个像素:这应该导致两条线具有相同的厚度。

    要使用抗锯齿功能,请执行以下操作(未经测试的代码!)。代码从here获取:

    Graphics2D graphics2D = (Graphics2D) g_;
    
    graphics2D.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    
    graphics2D.drawLine(_x, _y, _x+_w, _y+_h);
    graphics2D.drawLine(_x, _y+_h, _x+_w, _y);