2011-03-14 5 views
4

수정 됨 : 문제는 각면이 단색 기본 색상으로 시작하고 테두리 범위 내에서 흰색으로 희미 해지는 4면 테두리를 페인트하는 것입니다. 문제는 국경의 교차점을 매끄럽게 보이게 만드는 것이 었습니다. 이를 달성하기 위해 경계를 그린 다음 삼각형을 사용하여 모서리를 '혼합'하십시오. 두 개의 평행 한 변변이가 경계의 전체 길이 (즉, 사각형이 겹쳐지는 경우)가있는 경우 브로 더를 그리는 사각형에 겹침이 없거나 모서리 당 하나의 삼각형이 충분하면 (아래 그림과 같이) 모서리마다 두 개의 삼각형을 사용할 수 있습니다.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

추가 포인트를 당 그리기 –

+0

사용되는 두 개의 삼각형을 위해 모서리. 완벽하게 작동합니다. 고마워 친구. 진정한 Baller Status. –

3

오히려 만들고 4 개 사각형을 그림보다, 나는 Area 사용하여 외부 하나에서 내부 사각형을 차감하여 경계 영역을 나타내는 하나의 Shape을 만들 것입니다 :

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

어떤 유형의 그라데이션 페인트 객체를 사용하면 네면에 단색을 페인팅하고 중심을 향해 희미 해지기 쉬울까요? –

+0

@cs 학생 : 음, 아마도 이것에 적합하지 않을 것입니다. @ I82Much의 솔루션은 합리적인 것처럼 보입니다. 질문에 어떤 그라디언트를 만들고 싶지는 않았지만 게시 된 모든 코드를 해석해내는 데 시간이 걸리지 않았습니다. 그래도 이런 식으로 적용되는 하나의 주요 그래디언트가있는 꽤 멋진 그라데이션 테두리를 만들 수 있습니다. – ColinD

+0

Holla. Playa에 감사드립니다. –

관련 문제