@Override
  public void paint(Graphics g) {
    // Clear the editor
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    // In case g is provided by other graphics context (e.g during exporting)
    g2.setFont(getFont());
    g2.setBackground(background);
    Dimension size = getPreferredSize();
    g2.clearRect(0, 0, size.width, size.height);
    // TODO: Delete the follow two statements. For test only
    //        g2.setPaint(Color.yellow);
    //        g2.fillRect(0, 0, size.width, size.height);
    // Enable zooming
    g2.scale(scaleX, scaleY);

    List comps = displayedObject.getComponents();
    // Draw nodes first
    if (comps == null || comps.size() == 0) return;
    java.util.List edges = new ArrayList();
    Rectangle clip = g.getClipBounds();
    // Draw Compartments first
    List<RenderableCompartment> compartments = drawCompartments(g, comps, null, clip);
    drawComponents(g, normalComps, clip);
    if (isForNormal) {
      // Replace the original components with new set of Renderable objects for further processing
      RenderablePathway pathway = (RenderablePathway) displayedObject;
      List<Renderable> components = pathway.getComponents();
      components.clear();
      components.addAll(normalComps);
      components.addAll(compartments); // Don't forget them
      return;
    }
    // Draw a transparent background: light grey
    Color color = new Color(204, 204, 204, 175);
    g2.setPaint(color);
    //        Dimension size = getPreferredSize();
    // Preferred size has been scaled. Need to scale it back
    g2.fillRect(0, 0, (int) (size.width / scaleX + 1.0d), (int) (size.height / scaleY + 1.0d));
    // Draw disease related objects
    for (Renderable r : diseaseComps) {
      if (lofNodes.contains(r)) ((Node) r).setNeedDashedBorder(true);
    }
    drawComponents(g, diseaseComps, clip);
    if (overlaidObjects.size() > 0)
      drawComponents(
          g,
          overlaidObjects,
          clip,
          true); // Want to draw edge first so that no validation is needed.
    if (crossedObjects.size() > 0) drawCrosses(g, crossedObjects, clip);
    RenderablePathway pathway = (RenderablePathway) displayedObject;
    pathway.setBgComponents(new ArrayList<Renderable>(normalComps));
    List<Renderable> fgComps = new ArrayList<Renderable>();
    fgComps.addAll(diseaseComps);
    fgComps.addAll(overlaidObjects);
    // Don't want to place compartments and pathway
    for (Iterator<Renderable> it = fgComps.iterator(); it.hasNext(); ) {
      Renderable r = it.next();
      if (r instanceof RenderableCompartment || r instanceof RenderablePathway) it.remove();
    }
    pathway.setFgComponents(fgComps);
  }