2014-10-27 96 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