Java tutorial
import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.border.AbstractBorder; public class MainClass extends JPanel { public MainClass() { super(true); JSlider mySlider = new JSlider(); mySlider.setMajorTickSpacing(20); mySlider.setMinorTickSpacing(10); mySlider.setPaintTicks(true); mySlider.setPaintLabels(true); CurvedBorder border = new CurvedBorder(10, Color.darkGray); mySlider.setBorder(border); add(mySlider); } public static void main(String s[]) { JFrame frame = new JFrame("Custom Curved Border"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 150); frame.setContentPane(new MainClass()); frame.setVisible(true); } } class CurvedBorder extends AbstractBorder { private Color wallColor = Color.gray; private int sinkLevel = 10; public CurvedBorder() { } public CurvedBorder(int sinkLevel) { this.sinkLevel = sinkLevel; } public CurvedBorder(Color wall) { this.wallColor = wall; } public CurvedBorder(int sinkLevel, Color wall) { this.sinkLevel = sinkLevel; this.wallColor = wall; } public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { g.setColor(getWallColor()); // Paint a tall wall around the component for (int i = 0; i < sinkLevel; i++) { g.drawRoundRect(x + i, y + i, w - i - 1, h - i - 1, sinkLevel - i, sinkLevel); g.drawRoundRect(x + i, y + i, w - i - 1, h - i - 1, sinkLevel, sinkLevel - i); g.drawRoundRect(x + i, y, w - i - 1, h - 1, sinkLevel - i, sinkLevel); g.drawRoundRect(x, y + i, w - 1, h - i - 1, sinkLevel, sinkLevel - i); } } public Insets getBorderInsets(Component c) { return new Insets(sinkLevel, sinkLevel, sinkLevel, sinkLevel); } public Insets getBorderInsets(Component c, Insets i) { i.left = i.right = i.bottom = i.top = sinkLevel; return i; } public boolean isBorderOpaque() { return true; } public int getSinkLevel() { return sinkLevel; } public Color getWallColor() { return wallColor; } }