【问题标题】:How do I code a filthy rich gradient-painted border using Java Swing如何使用 Java Swing 编写肮脏的丰富渐变绘制边框
【发布时间】:2011-03-14 16:34:41
【问题描述】:

修订:问题是绘制一个四边边框,其中每边都以纯色基础颜色开始,并在边框的范围内向内淡化为白色。挑战在于使边界的交叉点看起来无缝。为此,可以绘制边界,然后使用三角形“混合”角。如果绘制 broder 的矩形没有重叠,则每个角可以使用两个三角形,或者如果两个平行的边界边延伸边界的整个长度(即矩形重叠),每个角一个三角形就足够了(如下所示)。


    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();
}

【问题讨论】:

    标签: java swing awt border gradient


    【解决方案1】:

    如果您不与矩形相交而是使用多边形 (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);
    

    这样矩形就不会重叠,而是在不同的部分之间有很好的清晰边缘。

    【讨论】:

    • 每个角使用了两个三角形。完美运行。多谢,伙计。真正的球员身份。
    【解决方案2】:

    我不会创建和绘制 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);
    

    【讨论】:

    • 哪种类型的渐变绘制对象有助于在所有四个面上绘制纯色,然后向中心淡化?
    • @cs 学生:嗯,这可能不适合那个。 @I82Much 的解决方案似乎是合理的。您没有在问题中指定您想要制作什么样的渐变,我也没有花时间解释您发布的所有代码来弄清楚。你可以制作一些非常漂亮的渐变边框,它们有一个主渐变,像这样适用于它们。
    猜你喜欢
    • 2012-04-21
    • 2014-05-09
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多