Archive for July, 2012

Java Swing 2D Create a Rounded Corner Polygon

July 21, 2012

Incase you are wondering I couldn’t find a straightforward method. Thus I wrote the following functions. Given a set of connecting points or a polygon the following function will return a polygon with rounded corners.

public static GeneralPath getRoundedGeneralPath(Polygon polygon) {
   List<int[]> l = new ArrayList<int[]>();
   for(int i=0; i < polygon.npoints; i++){
      l.add(new int[]{polygon.xpoints[i],polygon.ypoints[i]});
   }
   return getRoundedGeneralPath(l);
}
 
public static GeneralPath getRoundedGeneralPath(List<int[]> l) {
   List<Point> list=new ArrayList<Point>();
   for (int[] point : l){
      list.add(new Point(point[0],point[1]));
   }
   return getRoundedGeneralPathFromPoints(list);
}
public static GeneralPath getRoundedGeneralPathFromPoints(List<Point> l) {
   l.add(l.get(0));
   l.add(l.get(1));
   GeneralPath p = new GeneralPath();
   p.moveTo(l.get(0).x,l.get(0).y);
   for(int pointIndex=1; pointIndex<l.size()-1;pointIndex++){
      Point p1=l.get(pointIndex-1);
      Point p2=l.get(pointIndex);
      Point p3=l.get(pointIndex+1);
      Point mPoint = calculatePoint(p1, p2);
      p.lineTo(mPoint.x, mPoint.y);
      mPoint = calculatePoint(p3, p2);
      p.curveTo(p2.x, p2.y, p2.x, p2.y, mPoint.x, mPoint.y);
   }
   return p;
}
private static Point calculatePoint(Point p1, Point p2) {
   float arcSize=10;
   double d1=math.sqrt(math.pow(p1.x-p2.x, 2)+math.pow(p1.y-p2.y, 2));
   double per=arcSize/d1;
   double d_x=(p1.x-p2.x)*per;
   double d_y=(p1.y-p2.y)*per;
   int xx=(int)(p2.x+d_x);
   int yy=(int)(p2.y+d_y);
   return new Point(xx,yy);
}
Example
   public static void main(String args[]) {
        JFrame f = new JFrame("Rounded Corner Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                Graphics2D g2d = (Graphics2D) grphcs;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);

                GradientPaint gp = new GradientPaint(0, 0,
                        getBackground().brighter().brighter(), 0, getHeight(),
                        getBackground().darker().darker());

                g2d.setPaint(gp);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                int[][] a={{50,0},{100,50},{50,100},{0,50}};
                GeneralPath p = getRoundedGeneralPath(Arrays.asList(a));
                g2d.setColor(Color.red);
                g2d.fill(p);
                super.paintComponent(grphcs);
            }
        };
        contentPane.setOpaque(false);
        f.setContentPane(contentPane);
        contentPane.add(new JLabel("test"));
        f.setSize(200, 200);
        f.setVisible(true);
    }

Have fun…