2011-03-14 27 views
4

修訂:問題是繪製四邊的邊框,其中每一邊都以固定的基色開始,並在邊框的跨度上向內漸變爲白色。面臨的挑戰是讓邊界的交叉看起來無縫。要做到這一點,可以繪製邊界,然後使用三角形來「混合」角點。如果兩個平行邊界延伸邊界的全部長度(即矩形重疊),則如果在畫出Broder的矩形中沒有重疊,或者每個角的一個三角形足夠(如下所示),則每個角可以使用兩個三角形。如何使用Java Swing編寫骯髒的漸變彩繪邊框


    private static final int GRADIENT_LENGTH = 29; 
    private static final int BAR_LENGTH = 25; 
    public static void paintGradientBorder(Graphics g, Color borderColor) {

Graphics2D g2 = (Graphics2D) g.create(); 

    GradientPaint gradientColorWest = new GradientPaint(0, 0, borderColor, 
      GRADIENT_LENGTH, 0, Color.WHITE); 
    GradientPaint gradientColorEast = new GradientPaint(WINDOW_WIDTH - GRADIENT_LENGTH, 
      0, Color.WHITE, WINDOW_WIDTH, 0, borderColor); 
    GradientPaint gradientColorNorth= new GradientPaint(0, 0, borderColor, 0, 
      GRADIENT_LENGTH, Color.WHITE); 
    GradientPaint gradientColorSouth = new GradientPaint(0, WINDOW_HEIGHT - GRADIENT_LENGTH, 
      Color.WHITE,0, WINDOW_HEIGHT, borderColor); 

    //south bar 
    g2.setPaint(gradientColorSouth); 
    g2.fillRect(0, WINDOW_HEIGHT - BAR_LENGTH, WINDOW_WIDTH, BAR_LENGTH); 
    //north bar 
    g2.setPaint(gradientColorNorth); 
    g2.fillRect(0, 0, WINDOW_WIDTH, BAR_LENGTH); 
    //west bar 
    g2.setPaint(gradientColorWest); 
    g2.fillRect(0, BAR_LENGTH, BAR_LENGTH, WINDOW_HEIGHT - BAR_LENGTH * 2); 
    //east bar 
    g2.setPaint(gradientColorEast); 
    g2.fillRect(WINDOW_WIDTH - BAR_LENGTH, BAR_LENGTH, WINDOW_WIDTH, WINDOW_HEIGHT - BAR_LENGTH * 2); 

    //NORTH WEST CORNER 
    //left triangle 
    Polygon p = new Polygon();   
    p.addPoint(0, 0); 
    p.addPoint(BAR_LENGTH, BAR_LENGTH); 
    p.addPoint(0, BAR_LENGTH); 
    g2.setPaint(gradientColorWest); 
    g2.fillPolygon(p);   
    //NORTH EAST CORNER 
    //right triangle 
    p.reset(); 
    p.addPoint(WINDOW_WIDTH, 0); 
    p.addPoint(WINDOW_WIDTH - BAR_LENGTH, BAR_LENGTH); 
    p.addPoint(WINDOW_WIDTH, BAR_LENGTH); 
    g2.setPaint(gradientColorEast); 
    g2.fillPolygon(p); 
    //SOUTH WEST CORNER 
    //left triangle 
    p.reset(); 
    p.addPoint(0, WINDOW_HEIGHT); 
    p.addPoint(0,WINDOW_HEIGHT - BAR_LENGTH); 
    p.addPoint(BAR_LENGTH, WINDOW_HEIGHT - BAR_LENGTH); 
    g2.setPaint(gradientColorWest); 
    g2.fillPolygon(p); 
    //SOUTH EAST CORNER 
    //right triangle 
    p.reset(); 
    p.addPoint(WINDOW_WIDTH, WINDOW_HEIGHT); 
    p.addPoint(WINDOW_WIDTH, WINDOW_HEIGHT - BAR_LENGTH); 
    p.addPoint(WINDOW_WIDTH - BAR_LENGTH, WINDOW_HEIGHT - BAR_LENGTH); 
    g2.setPaint(gradientColorEast); 
    g2.fillPolygon(p); 

    g2.dispose(); 
} 

回答

5

,如果你不相交的長方形,而是使用多邊形(的GeneralPath)什麼?

GeneralPath topBox = new GeneralPath(); 
topBox.moveTo(0, 0); 
// upper right 
topBox.lineTo(width, 0); 
// lower right; move diagonally down and to the left as in a picture frame 
topBox.lineTo(width - (insetX/2), 0 + (insetY/2)); 
// lower left 
topBox.lineTo((insetX/2), 0 + (insetY/2)); 
topBox.closePath(); 
g2.fill(topBox); 

enter image description here

這樣矩形不會重疊,而是你有不同環節之間很好的清晰的邊緣。

+2

加分每繪圖 – 2011-03-14 17:41:47

+0

用兩個三角形角。完美的作品。多謝,夥計。真正的芭蕾舞者狀態。 – 2011-03-14 20:58:27

3

而不是創建和繪畫4個矩形,我將創建一個單一的Shape使用Area從一個外減去內部矩形代表你的邊界區域:

Area area = new Area(new Rectangle2D.Double(...)); 
Area inner = new Area(new Rectangle2D.Double(...)); 
area.subtract(inner); 

g2.setPaint(new GradientPaint(...)); 
g2.fill(area); 
+0

什麼類型的漸變顏料對象將有助於在所有四面上繪製純色,然後向中心漸變? – 2011-03-14 17:15:37

+0

@cs學生:嗯,這可能不會那麼理想。 @ I82Much的解決方案看起來很合理。您沒有在問題中指定想要創建的梯度類型,而且我也沒有花時間解釋您發佈的所有代碼以找出它。你可以製作一些相當漂亮的漸變邊框,它們有一個適用於它們的主漸變,但是這樣做。 Holla。 – ColinD 2011-03-14 17:25:00

+0

Holla。謝謝普拉亞。 – 2011-03-14 23:05:22