2014-02-24 120 views
19

我的問題是我想在面板中畫一條虛線,我能夠做到這一點,但它也是以虛線繪製我的邊框,這也是我的上帝!在java中繪製虛線

有人可以解釋爲什麼嗎?我使用的paintComponent繪製直畫到面板

這是代碼畫虛線:

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){ 
     Graphics2D g2d = (Graphics2D) g; 
     //float dash[] = {10.0f}; 
     Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0); 
     g2d.setStroke(dashed); 
     g2d.drawLine(x1, y1, x2, y2); 
    } 

回答

28

您正在修改的Graphics實例傳遞到paintComponent(),也用於油漆邊界。

相反,使Graphics實例的副本,並使用該做你的繪圖:

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){ 

     //creates a copy of the Graphics instance 
     Graphics2D g2d = (Graphics2D) g.create(); 

     //set the stroke of the copy, not the original 
     Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0); 
     g2d.setStroke(dashed); 
     g2d.drawLine(x1, y1, x2, y2); 

     //gets rid of the copy 
     g2d.dispose(); 
} 
+0

我有一個快速問題:在哪種情況下,我必須克隆當前的圖形?顯然克隆每個圖形實例是不必要的:) –

+0

任何時候你修改圖形對象。顏色等設置可能會被其他繪畫方法重新設置,但筆畫等設置並不總是重置。它可能會因不同的外觀和感覺而有所不同,所以安全性比抱歉更好。 –

2

可以通過設置一個行程修改圖形上下文,以及隨後的方法,如paintBorder()使用相同的上下文,因此繼承你所做的所有修改。

解決方案: 克隆上下文,將其用於繪畫並在之後進行處置。

代碼:

// derive your own context 
Graphics2D g2d = (Graphics2D) g.create(); 
// use context for painting 
... 
// when done: dispose your context 
g2d.dispose(); 
2

另一種可能性是存儲在交換使用的局部變量(防爆顏色,筆畫等...)的值,並設定他們回到上使用的圖形。

類似:

Color original = g.getColor(); 
g.setColor(// your color //); 

// your drawings stuff 

g.setColor(original); 

這會爲你決定做圖形變化的任何工作。