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()orcreategrahpics()(for graphics2d object) - draw graphics object
- then
dispose()graphics object.
- when need draw, graphics object bufferedimage using
- then call
repaint()ask jvm repaint component. - draw image in
paintcomponentmethod callingg.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
Post a Comment