Java tutorial
import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; import javax.swing.border.AbstractBorder; public class RectangleBorder extends AbstractBorder { protected Insets thickness; protected Color lineColor; protected Insets gap; public RectangleBorder(Color color) { this(color, new Insets(1, 1, 1, 1)); } public RectangleBorder(Color color, Insets thickness) { this(color, thickness, thickness); } public RectangleBorder(Color color, Insets thickness, Insets gap) { lineColor = color; this.thickness = thickness; this.gap = gap; } public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Color oldColor = g.getColor(); g.setColor(lineColor); // top for (int i = 0; i < thickness.top; i++) { g.drawLine(x, y + i, x + width, y + i); } // bottom for (int i = 0; i < thickness.bottom; i++) { g.drawLine(x, y + height - i - 1, x + width, y + height - i - 1); } // right for (int i = 0; i < thickness.right; i++) { g.drawLine(x + width - i - 1, y, x + width - i - 1, y + height); } // left for (int i = 0; i < thickness.left; i++) { g.drawLine(x + i, y, x + i, y + height); } g.setColor(oldColor); } /** * Returns the insets of the border. * * @param c * the component for which this border insets value applies */ public Insets getBorderInsets(Component c) { return gap; } public Insets getBorderInsets(Component c, Insets insets) { insets.left = gap.left; insets.top = gap.top; insets.right = gap.right; insets.bottom = gap.bottom; return insets; } /** * Returns the color of the border. */ public Color getLineColor() { return lineColor; } /** * Returns the thickness of the border. */ public Insets getThickness() { return thickness; } /** * Returns whether or not the border is opaque. */ public boolean isBorderOpaque() { return false; } public Insets getGap() { return gap; } }