java - Paint program not using parallel arrays to store size and color properly -


it's simple paint-style program based on use of arrays , arraylists save coordinates, sizes, , colors of different points draw on screen using jframe, paintcomponent, , various mouse listeners.

i fixed problem spit out arrayoutofbounds error , point line 34 colors array exceeding limit of 10000. need program run , size , color of each point parallel each other, each time program repaints points, each retains own size , color variables. thank input!

    import java.util.arraylist;     import javax.swing.jpanel;     import java.awt.*;     import java.awt.event.*;      public class proj1panel extends jpanel{         public int size = 5, c = 0, s = 0;          private arraylist<point> pointlist;         public int[] sizes;         public color[] colors;          public proj1panel(){             pointlist = new arraylist<point>();             sizes = new int[10000];             colors = new color[10000];              addmouselistener (new proj1listener());             addmousemotionlistener (new proj1listener());             addmousewheellistener (new proj1listener());              setbackground(color.black);             setpreferredsize(new dimension(300, 200));         }         public void paintcomponent(graphics page){             super.paintcomponent(page);             for(point spot : pointlist){                 page.setcolor(colors[c]);                 page.fillrect(spot.x-sizes[pointlist.size()], spot.y-sizes[pointlist.size()], sizes[pointlist.size()]*2, sizes[pointlist.size()]*2);                 c = 0;             }             repaint();             page.setcolor(color.red);             page.fillrect(5, 40, 30, 30);             page.setcolor(color.blue);             page.fillrect(5, 75, 30, 30);             page.setcolor(color.green);             page.fillrect(5, 110, 30, 30);             page.setcolor(color.white);             page.fillrect(5, 145, 30, 30);             page.setcolor(color.white);             page.drawstring("count: " + pointlist.size() + "/10000", 5, 15);             page.drawstring("size: " + size, 5, 30);         }         private class proj1listener implements mouselistener, mousemotionlistener, mousewheellistener{             public void mousepressed(mouseevent event){                 pointlist.add(event.getpoint());                 sizes[pointlist.size()] = size;                 repaint();             }             public void mousedragged(mouseevent event){                 pointlist.add(event.getpoint());                 sizes[pointlist.size()] = size;                 repaint();             }             public void mousewheelmoved(mousewheelevent event){                 size -= event.getwheelrotation();                 repaint();             }             public void mouseclicked(mouseevent event){                 int x1 = event.getx();                 int y1 = event.gety();                 if(x1 > 5 && x1 < 35 && y1 > 40 && y1 < 70){                     colors[c] = color.red;                 }                 if(x1 > 5 && x1 < 35 && y1 > 75 && y1 < 105){                     colors[c] = color.blue;                 }                 if(x1 > 5 && x1 < 35 && y1 > 110 && y1 < 140){                     colors[c] = color.green;                 }                 if(x1 > 5 && x1 < 35 && y1 > 145 && y1 < 175){                     colors[c] = color.white;                 }             }             public void mousereleased(mouseevent event){}             public void mouseentered(mouseevent event){}             public void mouseexited(mouseevent event){}             public void mousemoved(mouseevent event){}         }     } 

edit:
able fix problem had program. had reset couple variables before drawing loop. here working program!

import java.util.arraylist; import javax.swing.jpanel; import java.awt.*; import java.awt.event.*;  public class proj1panel extends jpanel{     public int size = 5, c = 0, s = 0;     private arraylist<point> pointlist;     private int[] sizes;     private color[] colors;     public string coloris = "white";      public proj1panel(){         pointlist = new arraylist<point>();         sizes = new int[1000000];         colors = new color[1000000];          addmouselistener (new proj1listener());         addmousemotionlistener (new proj1listener());         addmousewheellistener (new proj1listener());          setbackground(color.black);         setpreferredsize(new dimension(300, 200));     }     public void paintcomponent(graphics page){         super.paintcomponent(page);         page.setcolor(color.white);         c = 0;         s = 0;         for(point spot : pointlist){             page.setcolor(colors[c]);             page.fillrect(spot.x-sizes[s], spot.y-sizes[s], sizes[s]*2, sizes[s]*2);             c++;             s++;         }         repaint();         page.setcolor(color.black);         page.fillrect(0, 0, 150, 35);         page.setcolor(color.black);         page.fillrect(0, 35, 40, 180);         page.setcolor(color.red);         page.fillrect(5, 40, 30, 30);         page.setcolor(color.blue);         page.fillrect(5, 75, 30, 30);         page.setcolor(color.green);         page.fillrect(5, 110, 30, 30);         page.setcolor(color.white);         page.fillrect(5, 145, 30, 30);         page.setcolor(color.white);         page.fillrect(5, 180, 30, 30);         page.setcolor(color.black);         page.fillrect(7, 182, 26, 26);         page.setcolor(color.white);         page.drawstring("count: " + pointlist.size() + "/1000000", 5, 15);         page.drawstring("size: " + size, 5, 30);         page.drawstring("color: ", 65, 30);         page.drawstring(coloris, 100, 30);     }     private class proj1listener implements mouselistener, mousemotionlistener, mousewheellistener{         public void mousepressed(mouseevent event){             pointlist.add(event.getpoint());             sizes[pointlist.size()] = size;             repaint();         }         public void mousedragged(mouseevent event){             pointlist.add(event.getpoint());             sizes[pointlist.size()] = size;             repaint();         }         public void mousewheelmoved(mousewheelevent event){             size -= event.getwheelrotation();             repaint();         }         public void mouseclicked(mouseevent event){             int x1 = event.getx();             int y1 = event.gety();             if(x1 > 5 && x1 < 35 && y1 > 40 && y1 < 70){                 colors[c] = color.red;                 coloris = "red";             }             if(x1 > 5 && x1 < 35 && y1 > 75 && y1 < 105){                 colors[c] = color.blue;                 coloris = "blue";             }             if(x1 > 5 && x1 < 35 && y1 > 110 && y1 < 140){                 colors[c] = color.green;                 coloris = "green";             }             if(x1 > 5 && x1 < 35 && y1 > 145 && y1 < 175){                 colors[c] = color.white;                 coloris = "white";             }             if(x1 > 5 && x1 < 35 && y1 > 180 && y1 < 210){                 colors[c] = color.black;                 coloris = "black";             }         }         public void mousereleased(mouseevent event){}         public void mouseentered(mouseevent event){}         public void mouseexited(mouseevent event){}         public void mousemoved(mouseevent event){}     } } 

you never reset c variable, used index color array, 0 in paintcomponent method. instead set 0 once in beginning of program. monotonically increase until array overflows. consider resetting 0 @ beginning of paintcomponent.

also, kind of point class using? holds array, not seeing. here:

spot.x-sizes[pointlist.size()] 

edit
apologize misread code, , didn't explain answer well. still should increment c variable, should re-set 0 @ beginning of paintcomponent. example:

public void paintcomponent(graphics page) {   super.paintcomponent(page);   c = 0;  // each time paintcomponent starts, c should 0   (point spot : pointlist) {      page.setcolor(colors[c]);      page.fillrect(spot.x - sizes[pointlist.size()], spot.y            - sizes[pointlist.size()], sizes[pointlist.size()] * 2,            sizes[pointlist.size()] * 2);      c++;  // within loop, should increment.   }   // .... etc 

alternatively, don't use for-each loop, rather basic loop, , way wouldn't need c variable.


Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

jsf - How to ajax update an item in the footer of a PrimeFaces dataTable? -

django - CSRF verification failed. Request aborted. CSRF cookie not set -