java - How to stop JComponent from clearing? -


i making molecule designing application. can draw lines , circles, clears old lines each time click, basically, can design molecules 2 atoms. also, mouseevents don't deliver if click fast problem. here code:

import java.awt.color; import java.awt.dimension; import java.awt.graphics; import java.awt.graphics2d; import java.awt.point; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.image.bufferedimage;  import javax.swing.jcomponent; import javax.swing.jframe; public class moleculedesigner extends jcomponent implements mouselistener {     private point op, cp;     private boolean first = true;     public static final color linecolor = new color(0, 255, 0);     private static final long serialversionuid = 1l;     private bufferedimage img = new bufferedimage(100, 100, bufferedimage.type_int_rgb);     public moleculedesigner() {         jframe f = new jframe("molecule designer");         f.setbackground(color.white);         f.addmouselistener(this);         f.add(this);         f.setsize(100, 100);         f.setdefaultcloseoperation(3);         f.setvisible(true);     }     public static void main(string[] args) {         new moleculedesigner();     }     @override     protected void paintcomponent(graphics g) {         if(op != null && cp != null) {             graphics2d g2 = img.creategraphics();             super.paintcomponent(g2);             g2.setcolor(linecolor);             g2.drawline((int) op.getx(), (int) op.gety(), (int) cp.getx(), (int) cp.gety());             g2.setcolor(color.black);             g2.filloval((int) cp.getx(), (int) cp.gety(), 10, 10);             op = (point) cp.clone();             g2.dispose();         }     }     @override     public dimension getpreferredsize() {         return getparent().getmaximumsize();     }     @override     public void mouseclicked(mouseevent e) {         if(!first) {             cp = e.getpoint();             cp.setlocation(cp.getx(), cp.gety() - 8);         }         else {             op = e.getpoint();             first = false;         }         repaint();     }     @override public void mousepressed(mouseevent e) {}     @override public void mousereleased(mouseevent e) {}     @override public void mouseentered(mouseevent e) {}     @override public void mouseexited(mouseevent e) {} } 

all appreciated!

either 1) draw in bufferedimage displayed inside of paintcomponent override, or 2) put data arraylist or other collection, , iterate through collection inside of paintcomponent. i'd latter if needed data other purposes. also, never ever this:

public void update(graphics g) {     paintcomponent(g); } 

this not how swing graphics supposed done , potentially dangerous code. please read:


edit
more detail regarding option 1:

  • create bufferedimage using 1 of constructors.
  • do drawing on image.
    • when need draw, graphics object bufferedimage using getgraphics() or creategrahpics() (for graphics2d object)
    • draw graphics object
    • then dispose() graphics object.
  • then call repaint() ask jvm repaint component.
  • draw image in paintcomponent method calling g.drawimage(...), passing in buffered image.

benefits: drawing quicker, , use draw background images.
drawbacks: data points not available, , if need manipulation or animation of data points, not way go.


Comments

Popular posts from this blog

php - SPIP: From Tag directly to an article -

jquery - isAjaxRequest always return false -

ruby on rails - In a controller spec, how to find a specific tag in the generated view? -