java - Slow reaction(repainting) of mouseListener -
i made frame repaints when click on it(also new geometric figure painted) when click rapidly not responds fast, needs half sec beetween clicks. have done wrong?
import java.awt.frame; import java.awt.graphics; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.event.windowevent; import java.awt.event.windowlistener; import java.util.arraylist; import javax.swing.joptionpane; public class okienko extends frame implements mouselistener{ public static final int size = 500; public static int mx = 0,my = 0; public arraylist<wyrysowywalny> l; //collection of object draw okienko(){ l = new arraylist<wyrysowywalny>(); creategui(); } public void creategui(){ setsize(size, size); setvisible(true); setalwaysontop(true); settitle("zadanie 1"); addwindowlistener(new windowlistener() { public void windowopened(windowevent arg0) {} public void windowiconified(windowevent arg0) {} public void windowdeiconified(windowevent arg0) {} public void windowdeactivated(windowevent arg0) {} public void windowclosed(windowevent arg0) {} @override public void windowclosing(windowevent arg0) { joptionpane.showconfirmdialog(null, "dziekujemy za skorzystanie z programu","",joptionpane.plain_message); system.exit(0); } @override public void windowactivated(windowevent arg0) { repaint(); } }); addmouselistener(this); } @override public void mouseclicked(mouseevent e) {/// important! system.out.println(e.getx() + " " + e.gety()); mx = e.getx(); = e.gety(); int r; r = (int) (math.random() * 6); switch(r){ case 0: l.add(new trojkat(mx,my,lxy(),lxy(),lxy(),lxy()));break; // objects draw case 1: l.add(new prostokat(mx,my,lr(),lr()));break; case 2: l.add(new kwadrat(mx,my,lr()));break; case 3: l.add(new kolo(mx,my,lr()));break; case 4: l.add(new elipsa(mx,my,lr(),lr())); break; case 5: l.add(new trojkatrownoboczny(mx,my,lr())); break; } repaint(); } @override public void mouseentered(mouseevent arg0) {} @override public void mouseexited(mouseevent arg0) {} @override public void mousepressed(mouseevent arg0) {} @override public void mousereleased(mouseevent arg0) {} public static int lxy(){ return (int) (math.random()*size * 4d/5 + 1d/40*size); } public static int lr(){ return (int) (math.random()*200 - 1d/40*size); } public void paint(graphics g){ super.paint(g); for(wyrysowywalny w : l) w.draw(g);//draw object } public static void main(string[] args) { new okienko(); } }
absent complete example, can make several observations:
instead of
mouseclicked(), fires when mouse released in same component, may want respondmousepressed().also consider
mouseadapteronimplements mouselistener.as mentioned here, "swing programs should override
paintcomponent()instead of overridingpaint()."swing gui objects should constructed , manipulated only on event dispatch thread.
a more elaborate example no perceptible latency cited here.
Comments
Post a Comment