java - Jframe not repainting issue -
i have program simple in function. on start, creates random circle places in window/frame. when circle clicked, should dissappear, , spawn new circle elsewhere. issue is, program this, see past circles unless minimize/reopen window. cannot repaint without help... , not know why. here code.
import java.awt.color; import java.awt.eventqueue; import java.awt.graphics; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.geom.ellipse2d; import java.util.arraylist; import java.util.random; import javax.swing.jframe; public class core extends jframe implements mouselistener{ public static arraylist<ellipse2d> list = new arraylist<ellipse2d>(); random r = new random(); public ellipse2d spawn(){ int x = r.nextint(this.getwidth()); int y = r.nextint(this.getheight()); while(x<75||x>this.getwidth()-150){ x = r.nextint(this.getwidth()); } while(y<75||y>this.getheight()-150){ y = r.nextint(this.getheight()); } system.out.println("making shape @ :" + x + " , " + y); return new ellipse2d.double(x, y, 75, 75); } public void mouseclicked(mouseevent me) { // save coordinates of click lke this. if(list.get(0).contains(me.getpoint())){ system.out.println("clicked shape!"); list.clear(); list.add(spawn()); } revalidate(); repaint(); } public void mouseentered(mouseevent e) { } public void mousereleased(mouseevent e) { } public void mousepressed(mouseevent e) { } public void mouseexited(mouseevent e) { } @override public void paint(graphics g) { if(list.size()==0){ system.out.println("oops"); } if(!list.isempty()){ system.out.println("draw"); int x =(int) list.get(0).getx(); int y =(int) list.get(0).gety(); int width = (int) list.get(0).getwidth(); int height = (int) list.get(0).getheight(); g.setcolor(color.red); g.drawoval(x,y, width, height); } } public core(){ setsize(500, 500); setdefaultcloseoperation(jframe.exit_on_close); this.addmouselistener(this); list.add(spawn()); setvisible(true); } public static void main(string args[]) { eventqueue.invokelater(new runnable() { public void run() { new core(); } }); } }
your code works fine me, however...
- don't override
paintof top level containersjframe,jframecontainsjrootpane, containscontentpane, may have visibleglasspane, of can overpaint painted withinpaintmethod. general rule, shouldn't extendjframe(or other top level containers), locking single use case, reducing re-usability of component , you're not new functionality class. instead, usejpanel, override it'spaintcomponentmethod - call
super.paintbefore doing custom painting. if, however, usejpanel, callsuper.paintcomponent. painting performed series of methods chained generate final output. see painting in awt , swing , performing custom painting more details - consider using
x = r.nextint(this.getwidth() - 150) + 75;,y = r.nextint(this.getwidth() - 150) + 75;instead of while loops, think might find them safer use
for example...
import java.awt.color; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.ellipse2d; import java.util.arraylist; import java.util.random; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.swingutilities; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; public class core { public static void main(string args[]) { eventqueue.invokelater(new runnable() { public void run() { new core(); } }); } public core() { eventqueue.invokelater(new runnable() { @override public void run() { try { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) { ex.printstacktrace(); } jframe frame = new jframe("testing"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add(new corepane()); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true); } }); } public class corepane extends jpanel { private arraylist<ellipse2d> list = new arraylist<ellipse2d>(); private random r = new random(); public ellipse2d spawn() { int x = r.nextint(this.getwidth()); int y = r.nextint(this.getheight()); x = r.nextint(this.getwidth() - 150) + 75; y = r.nextint(this.getwidth() - 150) + 75; system.out.println("making shape @ :" + x + " , " + y); return new ellipse2d.double(x, y, 75, 75); } public corepane() { addmouselistener(new mouseadapter() { public void mouseclicked(mouseevent me) { // save coordinates of click lke this. if (list.get(0).contains(me.getpoint())) { list.clear(); list.add(spawn()); } revalidate(); repaint(); } }); } @override public void invalidate() { super.invalidate(); swingutilities.invokelater(new runnable() { @override public void run() { if (list.isempty()) { list.add(spawn()); } } }); } @override public dimension getpreferredsize() { return new dimension(500, 500); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g.create(); if (!list.isempty()) { (ellipse2d ellipse : list) { g2d.setcolor(color.red); g2d.draw(ellipse); } } g2d.dispose(); } } } or, based on believe you're trying do, like...
public class corepane extends jpanel { private random r = new random(); private ellipse2d ellipse; public ellipse2d spawn() { int x = r.nextint(this.getwidth()); int y = r.nextint(this.getheight()); x = r.nextint(this.getwidth() - 150) + 75; y = r.nextint(this.getwidth() - 150) + 75; system.out.println("making shape @ :" + x + " , " + y); return new ellipse2d.double(x, y, 75, 75); } public corepane() { addmouselistener(new mouseadapter() { public void mouseclicked(mouseevent me) { if (ellipse != null && ellipse.contains(me.getpoint())) { ellipse = spawn(); } revalidate(); repaint(); } }); } @override public void invalidate() { super.invalidate(); swingutilities.invokelater(new runnable() { @override public void run() { spawn(); } }); } @override public dimension getpreferredsize() { return new dimension(500, 500); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g.create(); if (ellipse != null) { g2d.setcolor(color.red); g2d.draw(ellipse); } g2d.dispose(); } }
Comments
Post a Comment