title: Dynamic Graphics Object Painting
body: <p>Trying to figure out the best way to do this (And without crossing any specifics DO NOTs that I don't know about).</p>
  
  <p>I'm working on visually displaying a graph (Various nodes, with edges connecting them) with circles and lines to represent such. Each node will be added during runtime and I can't hardcode this. From what I understand, all painting needs to be done in the paint(Graphics g) method - which isn't that helpful, since I can't be change the parameters and it seems this is only called during the initial creation?</p>
  
  <p>Right now I was thinking about having it call various other methods, passing the Graphics object, and depending on other variables - I'll decide whether that's what I even want to call (Since the paint() method is the only one I can call).</p>
  
  <p>Am I going about this completely wrong? Never bothered with this before.</p>
  
  <p>To give you a better idea of what I want to end up with: I want to be able to pass the coordinates of the shape I want to add for the node, and then add it to whatever I have on the graph so far. And then same with the edges, I want to be able to pass the beginning and end point of the line to repaint on top of whatever is existing at that time.</p>
  
  <p>Not exactly what I want right now - but you'll get the idea from what I patched together so far:</p>
  
  <pre><code>import java.awt.*;
  import javax.swing.*;
  public class MyCanvas extends Canvas
  {
      public MyCanvas()
      {
      }
      public void paint(Graphics graphics)
      {
          // Keep this until I figured out if it's painted on load or not.
          graphics.drawLine(10, 20, 350, 380);
      }
      public static void main(String[] args)
      {
          MyCanvas canvas = new MyCanvas();
          JFrame frame = new JFrame();
          int vertexes = 0;
          // Change this next part later to be dynamic.
          vertexes = 10;
          int canvasSize = vertexes * vertexes;
          frame.setSize(canvasSize, canvasSize);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(canvas);
          frame.setVisible(true);
      }
      public void drawNode(int x, int y, Graphics g)
      {
              // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 
              int xLoc = (x*10) - 5;
              int yLoc = (y*10) - 5;
              g.setColor(Color.white);
              g.fillOval(xLoc, yLoc, 8, 8);
              g.drawOval(xLoc, yLoc, 8, 8);
      }
      public void drawArc(int x, int y, int xx, int yy, Graphics g)
      {
              int xLoc = (x*10) - 5;
              int yLoc = (y*10) - 5;
              int xxLoc = (xx*10) - 5;
              int yyLoc = (yy*10) - 5;
              g.drawLine(xLoc, yLoc, xxLoc, yyLoc);
      }
  
  }
  </code></pre>
  
  <p>Edit: (Response for Andrew)</p>
  
  <pre><code>import java.awt.*;
  import java.awt.image.BufferedImage;
  import javax.swing.*;
  public class MyCanvas extends JPanel
  {
  
      public MyCanvas() {
  
      }
      public void paintComponent(Graphics g) {
          super.paintComponent(g);
      }
  
      public static void main(String[] args)
      { 
          int vertexes = 0;
          // Change this next part later to be dynamic.
          vertexes = 10;
          int canvasSize = vertexes * vertexes;
  
          JFrame frame = new JFrame();
          JLabel label = new JLabel();
          BufferedImage bImage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_INT_ARGB);
          Graphics2D g2d = bImage.createGraphics();
          g2d.drawLine(50, 50, 300, 300);
          ImageIcon iIcon = new ImageIcon(bImage); 
          label.setIcon(iIcon);
          frame.add(label);
          frame.setVisible(true);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          g2d = drawNode(1,1,g2d);
          label.repaint();
      }
  
      public static Graphics2D drawNode(int x, int y,Graphics2D g2d)
      {
              // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 
              int xLoc = (x*10) - 5;
              int yLoc = (y*10) - 5;
              g2d.setColor(Color.white);
              g2d.fillOval(xLoc, yLoc, 8, 8);
              g2d.drawOval(xLoc, yLoc, 8, 8);
              return g2d;
      }
      public static void drawArc(int x, int y, int xx, int yy)
      {
              int xLoc = (x*10) - 5;
              int yLoc = (y*10) - 5;
              int xxLoc = (xx*10) - 5;
              int yyLoc = (yy*10) - 5;
             // g.drawLine(xLoc, yLoc, xxLoc, yyLoc);
      }
  
  }
  </code></pre>