2014-10-27 77 views
1

我有以下代码:绘制斜线与Java

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的笔画时,两行之间没有区别)。

跟进到奥拉维的ansewer:

使用奇数的笔触像素的不解决这个问题:

Stroke 3px

启用抗锯齿导致了另一个问题:画十字的正方形笔划模糊不清:

Stroke 2px + antialiasing

+0

1.更好地帮助越早张贴SSCCE/MCVE短,可运行,编译,只是描述问题,2好于甲骨文官方解释教程的Graphics2D – mKorbel 2014-10-27 10:52:43

回答

3

基本上,你有两个选择:

  1. 使用奇数厚度
  2. 使用抗锯齿

我个人更喜欢抗锯齿,因为它的漂亮,我喜欢漂亮的东西。然而,为了解释为什么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); 
+0

谢谢,但这些都不解决方案是理想的(我编辑的帖子进一步解释)。除了移动一个像素左边或右边不会改变事物。 – gregseth 2014-10-27 13:02:49

+0

@gregseth我惊讶于奇数宽度不适合你。这实际上可能是java中的一个错误,尽管我不敢说那些记录。一种直接的解决方案是将'n'1px宽度的对角线彼此相邻,其中'n'是最终期望的笔划宽度。请注意,在您提供的第一张图片中,从左下到右上的线是正确绘制的线;另一条线的行程宽度实际上是3。 – 2014-10-27 15:17:38