java - How to paint permanently on JComponent -
i'm trying create paint application in java.
- i have "canvas" class extends jcomponent.
- i have arraylist of type shape holds shapes of entire drawing.
inside paintcomponent() method:
- each loop gets cleared
- every shape inside arraylist gets painted either g.draw() or g.fill()
- if want add shape or draw shape, add arraylist.
the problem after considerably high amount of shapes inside arraylist, execution of paintcomponent() method slows.
for example custom brush.
- when dragging brush on canvas have add new shape of type "custombrush extends shape" arraylist
- so single stroke end hundreds of shapes in arraylist
the question is:
- how "pack" 100 shape objects one, single brush stroke becomes 1 single object in arraylist ?
- the ultimate goal speed paintcomponent() method paints drawn shapes faster.
thank you!
here's sample code:
public class graphicpanel extends jcomponent{ private arraylist<shape> shapebuffer; public void paintcomponent( graphics gplain ){ graphics2d g = (graphics2d)gplain; for( shape s : shapebuffer ){ if( filled.next() ){ g.fill( s ); } else{ g.draw( s ); } } }
paint background bufferedimage, , draw bufferedimage grahpicpanel within paintcomponent(...) method using g.drawimage(...). bufferedimage's graphics context calling getgraphics() or creategraphics() (for graphics2d object). don't forget dispose of graphics object obtained in way (but never dispose of graphics object given jvm).
also, don't forget call super.paintcomponent(g) in override!
for example:
import java.awt.basicstroke; import java.awt.color; import java.awt.dimension; import java.awt.graphics; import java.awt.graphics2d; import java.awt.point; import java.awt.rectangle; import java.awt.stroke; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.image.bufferedimage; import java.util.random; import javax.swing.*; public class mypaint extends jcomponent { private static final int pref_w = 600; private static final int pref_h = pref_w; private static final stroke stroke = new basicstroke(4f); private static final color[] colors = { color.red, color.green, color.yellow, color.orange, color.blue, color.cyan }; private bufferedimage img = new bufferedimage(pref_w, pref_h, bufferedimage.type_int_argb); private rectangle rect = null; public mypaint() { mymouse mymouse = new mymouse(); addmouselistener(mymouse); addmousemotionlistener(mymouse); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); if (img != null) { g.drawimage(img, 0, 0, null); } if (rect != null) { g.setcolor(color.light_gray); ((graphics2d) g).draw(rect); } } @override public dimension getpreferredsize() { if (ispreferredsizeset()) { return super.getpreferredsize(); } return new dimension(pref_w, pref_h); } private class mymouse extends mouseadapter { private random random = new random(); private point p; @override public void mousepressed(mouseevent e) { if (e.getbutton() != mouseevent.button1) { return; } p = e.getpoint(); } @override public void mousereleased(mouseevent e) { if (p != null) { rectangle rect2 = createrect(e.getpoint()); graphics2d g2 = img.creategraphics(); g2.setstroke(stroke); color c = colors[random.nextint(colors.length)]; g2.setcolor(c); g2.fill(rect2); g2.setcolor(c.darker()); g2.draw(rect2); g2.dispose(); } p = null; rect = null; repaint(); } @override public void mousedragged(mouseevent e) { rect = createrect(e.getpoint()); repaint(); } private rectangle createrect(point p2) { int x = math.min(p.x, p2.x); int y = math.min(p.y, p2.y); int width = math.abs(p.x - p2.x); int height = math.abs(p.y - p2.y); rectangle rect2 = new rectangle(x, y, width, height); return rect2; } } private static void createandshowgui() { mypaint mainpanel = new mypaint(); jframe frame = new jframe("mypaint"); frame.setdefaultcloseoperation(jframe.dispose_on_close); frame.getcontentpane().add(mainpanel); frame.setresizable(false); frame.pack(); frame.setlocationbyplatform(true); frame.setvisible(true); } public static void main(string[] args) { swingutilities.invokelater(new runnable() { public void run() { createandshowgui(); } }); } }
Comments
Post a Comment