2011-08-04 47 views
3

我希望能夠使用與下圖相似的JFreeChart創建條形圖。如何在矩形上創建和分配斜條紋?

the desired result

這是一個非常基本的單色的條形圖,但有一個「神奇」的細節:斜條紋。我想這可能是通過在正常酒吧​​頂部疊加另一張照片來實現的。這張照片的尺寸與酒吧相同,具有對角線的白色條紋和透明背景。我不太清楚該怎麼做,因爲我的GUI經驗很少,但是我發現了一個處理JFreeChart圖形頂層圖像的very useful article,所以我相當肯定我應該能夠解決這個問題。

但是,我應該如何創建斜條紋? 我看到如何將線從左下角分佈到右上角,但不是左上角和右下角的上限線。我能以某種方式在矩形外繪畫(而不是將其包含在圖片中)?

編輯:經過一番搜索後,我看不到我用疊加透明背景圖片的建議,因爲我找不到任何有關如何操作的例子。另一方面,僅僅在矩形上畫線可能更容易。

+0

你想在圖表的酒吧或背景這種模式? – trashgod

+0

我想繪製酒吧,而不是背景。 – oligofren

回答

4

使用漸變填充繪製線條

在trashgod的尖端我試圖填充的形狀與一個梯度有尖銳的邊緣,以模擬線路圖。這會阻止很多計算,並且可能會更簡單。對於粗線來說它工作得很好,但對於更細的線不適用。使用原始圖形

雖然簡單,它沒有我的情況下工作

rect.setSpace(spaceBetweenLines); 
    Color bg = Color.YELLOW; 
    Color fg = Color.BLUE; 
    rect.setPaint(new LinearGradientPaint(
      (float) startX, (float) startY, (float) (startX + spaceBetweenLines), (float) (startY + spaceBetweenLines), 
      new float[] {0,.1f,.1001f}, new Color[] {fg,fg,bg}, MultipleGradientPaint.CycleMethod.REPEAT) 
    ); 

Trying to paint thin lines using a gradient fill

畫線:使用下面的代碼產生填寫的第一個畫面。更精細的,但對我來說,更自然的方式,只是在形狀(矩形,圓形,...)上繪製線條。以下代碼用於生成第二個圖像。注意使用clip(Shape s)將線條繪製限制在下面的形狀中。不簡單畫一個矩形並使用clip()來限制形狀的原因是clip()操作不是別名,因此產生鋸齒。因此,我必須首先繪製形狀以獲得平滑邊緣,然後設置剪輯以防止即將出現的線條圖中出現溢出,最後繪製線條。

public void paint(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    g2.setPaint(getBackground()); 
    g2.fill(getShape()); 
    g2.setClip(getShape()); 

    // draw diagonal lines 
    g2.setPaint(getLineColor()); 

    for (int x = (int) this.x, y = (int) (this.y); y - height < (this.y + height + getSpace());) { 
     g2.drawLine(x, y , x + (int) width , y - (int) width); 

     y += getSpace(); 
    } 

Just painting lines on top of another shape using clip(Shape s) to limit overflow

+1

剛剛有一個類似的要求,並使用'MultipleGradientPaint.CycleMethod.REFLECT'的線性漸變。這種方式沒有腐敗。 – predi

+0

謝謝我一直在尋找:) –

+0

有沒有什麼辦法可以在android中實現這個代碼或者請發佈完整的代碼給上述答案@oligofren –

2

source code對於BarChartDemo1顯示瞭如何應用GradientPaint,但您可能想要使用LinearGradientPaint進行試驗以獲得對角效果。

我想繪製酒吧,而不是背景。

如果您已有合適的圖像,TexturePaint可能是一種替代方案。有兩種技術here的討論。

+0

謝謝你,但這似乎比必要的更先進......?我用一些更多的信息更新了我的問題:它繪製了角落案例(字面意思),這是問題。 – oligofren

+0

注意'LinearGradientPaint'需要Java 1.6+。 – trashgod

+0

我已經詳細闡述過了。 – trashgod