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

Popular posts from this blog

node.js - Using Node without global install -

How to access a php class file from PHPFox framework into javascript code written in simple HTML file? -

java - Null response to php query in android, even though php works properly -