@Override
    public void draw(Graphics2D g2) {
        g2.setStroke(getLineStroke());
        Color oldColour = g2.getColor();
        g2.setColor(getLineColour());

        // Antialiasing
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
        
        double x1 = getStart().getPositionX();
        double y1 = getStart().getPositionY();
        // The R of the circle
        R = (getStart().getBounds().getWidth()*2);
        // comput upper rectangle left corner posision, the rectangle contains
        // the circle
        this.x = x1 + getStart().getBounds().getWidth()/2 - R/2;
        this.y = y1 + getStart().getBounds().getHeight()/2 - R;
        g2.draw(new Arc2D.Double(x, y, R, R, 300, 300, Arc2D.OPEN));
        // draw label
        FontMetrics fontMetrics = g2.getFontMetrics();
        if(!getLabel().isEmpty()){
            g2.setColor(Color.BLACK);
            float width = fontMetrics.stringWidth(getLabel());
            g2.drawString(getLabel(), (float)(x+R/2) - width/2, (float)y - 5.0f);
        }
        
        // draw arrow string
        String arrows = getArrowString();
        float width = fontMetrics.stringWidth(arrows);
        if (!arrows.equals("-")){
            g2.drawString(arrows, (float)(x+R/2) - width/2, (float)(y+R/3));
        }
        g2.setColor(oldColour);
    }