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
Post a Comment