简体   繁体   English

在Java Swing中创建一定宽度的BevelBorder

[英]Create BevelBorder of certain width in Java Swing

I am trying to create a Button like below using combination of Borders. 我正在尝试使用Borders的组合创建如下的Button。

While using BorderFactory or Bevel classes, there is no option to give the width. 使用BorderFactory或Bevel类时,没有选项可以给出宽度。

Is it possible to give width to BevelBorder in Java Swing? 是否可以在Java Swing中为BevelBorder提供宽度?

在此输入图像描述

No, you cannot set the width of a BevelBorder . 不,您无法设置BevelBorder的宽度。 A BevelBorder just draws two 1px lines per edge - one for the outer shadow and one for the inner shadow. BevelBorder每条边绘制两条1px线 - 一条用于外部阴影,另一条用于内部阴影。 Unfortunately, just calling setStroke wouldn't work, because on each corner one color would just overlap the other and it would come to other unpleasant visuals. 不幸的是,只是调用setStroke是行不通的,因为在每个角落,一种颜色只会与另一种颜色重叠,并且会出现其他不愉快的视觉效果。

Also, what you seem to request isn't really a BevelBorder . 此外,您似乎要求的并不是真正的BevelBorder It's a border with 5 color specifications: The top, right, bottom, left and line color. 它是5种颜色规格的边框:顶部,右侧,底部,左侧和线条颜色。 A BevelBorder doesn't have a line color and also doesn't have such color specifications. BevelBorder没有线条颜色,也没有这样的颜色规格。

I've made a class that extends AbstractBorder which should fit your requirements: 我已经创建了一个扩展AbstractBorder的类,它应该符合您的要求:

在此输入图像描述


import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.RenderingHints;

import javax.swing.border.AbstractBorder;

public class AdvancedBevelBorder extends AbstractBorder {

    private Color topColor, rightColor, bottomColor, leftColor, lineColor;
    private int borderWidth;

    public AdvancedBevelBorder(Color topColor, Color rightColor, Color bottomColor, Color leftColor, Color lineColor,
            int borderWidth) {
        setTopColor(topColor);
        setRightColor(rightColor);
        setBottomColor(bottomColor);
        setLeftColor(leftColor);
        setLineColor(lineColor);
        setBorderWidth(borderWidth);
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        super.paintBorder(c, g, x, y, width, height);

        int h = height;
        int w = width;
        int bw = getBorderWidth();
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.translate(x, y);

        Polygon topPolygon = createPolygon(new Point(0, 0), new Point(w, 0), new Point(w - bw, bw), new Point(bw, bw),
                new Point(0, 0));
        g2.setColor(getTopColor());
        g2.fill(topPolygon);
        g2.setColor(getLineColor());
        g2.draw(topPolygon);

        Polygon rightPolygon = createPolygon(new Point(w - 1, 0), new Point(w - 1, h), new Point(w - bw - 1, h - bw),
                new Point(w - bw - 1, bw), new Point(w - 1, 0));
        g2.setColor(getRightColor());
        g2.fill(rightPolygon);
        g2.setColor(getLineColor());
        g2.draw(rightPolygon);

        Polygon bottomPolygon = createPolygon(new Point(0, h - 1), new Point(w, h - 1), new Point(w - bw, h - bw - 1),
                new Point(bw, h - bw - 1), new Point(0, h - 1));
        g2.setColor(getBottomColor());
        g2.fill(bottomPolygon);
        g2.setColor(getLineColor());
        g2.draw(bottomPolygon);

        Polygon leftPolygon = createPolygon(new Point(0, 0), new Point(0, h), new Point(bw, h - bw), new Point(bw, bw),
                new Point(0, 0));
        g2.setColor(getLeftColor());
        g2.fill(leftPolygon);
        g2.setColor(getLineColor());
        g2.draw(leftPolygon);

        g2.dispose();
    }

    @Override
    public Insets getBorderInsets(Component c) {
        return new Insets(getBorderWidth(), getBorderWidth(), getBorderWidth() + 1, getBorderWidth() + 1);
    }

    private Polygon createPolygon(Point... points) {
        Polygon polygon = new Polygon();
        for (Point point : points) {
            polygon.addPoint(point.x, point.y);
        }
        return polygon;
    }

    public Color getTopColor() {
        return topColor;
    }

    public void setTopColor(Color topColor) {
        this.topColor = topColor;
    }

    public Color getRightColor() {
        return rightColor;
    }

    public void setRightColor(Color rightColor) {
        this.rightColor = rightColor;
    }

    public Color getBottomColor() {
        return bottomColor;
    }

    public void setBottomColor(Color bottomColor) {
        this.bottomColor = bottomColor;
    }

    public Color getLeftColor() {
        return leftColor;
    }

    public void setLeftColor(Color leftColor) {
        this.leftColor = leftColor;
    }

    public Color getLineColor() {
        return lineColor;
    }

    public void setLineColor(Color lineColor) {
        this.lineColor = lineColor;
    }

    public int getBorderWidth() {
        return borderWidth;
    }

    public void setBorderWidth(int borderWidth) {
        this.borderWidth = borderWidth;
    }

}

By the way, I made the component you can see in image with the following code: 顺便说一句,我使用以下代码制作了您可以在图像中看到的组件:

AdvancedBevelBorder border = new AdvancedBevelBorder(new Color(120, 172, 220), new Color(55, 93, 128),
        new Color(73, 124, 169), new Color(150, 191, 229), new Color(36, 83, 126), 10);
JPanel panel = new JPanel() {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 60);
    }
};
panel.setBackground(new Color(91, 154, 212));
panel.setBorder(border);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM