package aurelienribon.utils.swing; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import javax.swing.border.Border; public class GroupBorder implements Border { private final int titleHeight = 20; private final int borderPadding = 0; private String title = ""; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Graphics2D gg = (Graphics2D) g.create(); int titleW = gg.getFontMetrics().stringWidth(title) + 20; int titleDescent = gg.getFontMetrics().getDescent(); gg.setColor(c.getBackground()); if (!title.equals("")) { int[] xs = {0, titleW, titleW + titleHeight, 0}; int[] ys = {0, 0, titleHeight, titleHeight}; gg.fillPolygon(xs, ys, 4); gg.fillRect(0, titleHeight, width, height); gg.setColor(c.getForeground()); gg.drawString(title, 10, titleHeight - titleDescent); } else { gg.fillRect(0, 0, width, height); } gg.dispose(); } @Override public Insets getBorderInsets(Component c) { return new Insets(!title.equals("") ? borderPadding + titleHeight : borderPadding, borderPadding, borderPadding, borderPadding); } @Override public boolean isBorderOpaque() { return false; } }