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 paint of top level containers jframe, jframe contains jrootpane, contains contentpane , may have visible glasspane, of can overpaint painted within paint method. general rule, shouldn't extend jframe (or other top level containers), locking single use case, reducing re-usability of component , you're not new functionality class. instead, use jpanel , override it's paintcomponent method
  • call super.paint before doing custom painting. if, however, use jpanel, call super.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

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -