java - How to draw a rectangle moving in a circle around the center of the canvas? -


the code meant draw rectangle, moves in circle around center of canvas 1 time. code have

import java.awt.graphics; import java.awt.graphics2d; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.geom.rectangle2d; import javax.swing.timer; import javax.swing.jcomponent; import javax.swing.jframe;  public class q3_circular extends jcomponent {  protected int degree = 0; protected double xstart; protected double ystart; protected timer timer;   public q3_circular() {     timer = new timer(1000, new timercallback()); //creates new times refreshes every 100 ms, , called timercallback class     timer.start(); }  protected class timercallback implements actionlistener {      public void actionperformed(actionevent e) {          if (degree < (2 * math.pi)){             xstart = getwidth()/2 * math.cos(degree+1);             ystart = getheight()/2 * math.sin(degree+1);             degree+= 1;             repaint();         }         else {             degree += 0;             repaint();         }      } }   public static void main(string[] args) {     jframe frame = new jframe("animatedsquare");     q3_circular canvas = new q3_circular();     frame.add(canvas);     frame.setsize(300, 300);     frame.setdefaultcloseoperation(jframe.exit_on_close);            frame.setvisible(true); }     public void paintcomponent(graphics g){     xstart = (double)(getwidth())/2.0 * math.cos(degree);     ystart = (double)(getheight())/2.0 * math.sin(degree);      graphics2d g2 = (graphics2d) g;     g2.draw(new rectangle2d.double(xstart,ystart, 25,25));     repaint(); } } 

this code appears draw rectangle around point (0,0). i'm not sure code wrong.

your code confusing. here's gui created.

animated square

when creating swing gui, use model / view / controller pattern. create gui model, , gui view, , 1 or more controllers modify model , repaint view.

here changes made code.

  1. i created drawingrectangle class hold information drawing rectangle. class plain old java object getters , setters. class gui model.

  2. i moved out of main method except call swingutilities invokelater method. invokelater method puts creation , use of swing components on event dispatch thread. oracle , insist swing applications start on event dispatch thread.

  3. i create drawing rectangle in constructor of q3_circular class. generally, create gui model, gui view.

  4. i rearranged jframe code in run method in proper order. removed setsize method , replaced pack method. don't care how big jframe is. care how big drawing panel is.

  5. i created drawing panel jpanel. here, set preferred size of drawing panel. extend jpanel can override paintcomponent method.

  6. the paintcomponent method nothing paint drawing rectangle. no calculations or painting done in paintcomponent method. added call super paintcomponent method maintain swing paint chain , clear drawing panel before paint drawing rectangle. draw rectangle using x , y coordinates center of rectangle, rather upper left corner. 1 transformation in drawing code.

  7. i created drawing animation runnable. can use swing timer if want. find easier create own animation code. gui controller. here calculations, update model, , repaint drawing panel. in repaint method, use swingutilities invokelater method painting on event dispatch thread. because animation thread separate thread.

here's code. put classes paste code easier. should separate classes different files.

package com.ggl.testing;  import java.awt.color; import java.awt.dimension; import java.awt.graphics; import java.awt.geom.rectangle2d;  import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.swingutilities;  public class q3_circular implements runnable {      public static void main(string[] args) {         swingutilities.invokelater(new q3_circular());     }      private static final int drawing_width = 300;     private static final int drawing_height = drawing_width;      private drawingrectangle drawingrectangle;      public q3_circular() {         int center = drawing_width / 2;         rectangle2d rectangle = new rectangle2d.double(center, center, 32d, 32d);         drawingrectangle = new drawingrectangle(color.red, rectangle);     }      @override     public void run() {         jframe frame = new jframe("animated square");         frame.setdefaultcloseoperation(jframe.exit_on_close);          drawingpanel drawingpanel = new drawingpanel(drawing_width,                 drawing_height, drawingrectangle);         frame.add(drawingpanel);          frame.pack();         frame.setlocationbyplatform(true);         frame.setvisible(true);          new thread(new drawinganimation(drawingpanel, drawingrectangle))                 .start();     }      public class drawingpanel extends jpanel {          private static final long serialversionuid = 8226587438110549806l;          private drawingrectangle drawingrectangle;          public drawingpanel(int width, int height,                 drawingrectangle drawingrectangle) {             this.setpreferredsize(new dimension(width, height));             this.drawingrectangle = drawingrectangle;         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);              g.setcolor(drawingrectangle.getcolor());              rectangle2d rectangle = drawingrectangle.getrectangle();             int x = (int) math.round(rectangle.getx());             int y = (int) math.round(rectangle.gety());             int width = (int) math.round(rectangle.getwidth());             int height = (int) math.round(rectangle.getheight());             g.fillrect(x - width / 2, y - height / 2, width, height);         }      }      public class drawinganimation implements runnable {          private drawingpanel drawingpanel;          private drawingrectangle drawingrectangle;          public drawinganimation(drawingpanel drawingpanel,                 drawingrectangle drawingrectangle) {             this.drawingpanel = drawingpanel;             this.drawingrectangle = drawingrectangle;         }          @override         public void run() {             int xcenter = drawingpanel.getwidth() / 2;             int ycenter = drawingpanel.getheight() / 2;             double radius = drawingpanel.getwidth() / 3;              (int degree = 0; degree < 360; degree++) {                 double radians = math.toradians((double) degree);                 double x = radius * math.cos(radians) + xcenter;                 double y = radius * math.sin(radians) + ycenter;                 drawingrectangle.setrectangleorigin(x, y);                 repaint();                 sleep(100l);             }         }          private void sleep(long interval) {             try {                 thread.sleep(interval);             } catch (interruptedexception e) {              }         }          private void repaint() {             swingutilities.invokelater(new runnable() {                 @override                 public void run() {                     drawingpanel.repaint();                 }             });         }     }      public class drawingrectangle {          private final color color;          private rectangle2d rectangle;          public drawingrectangle(color color, rectangle2d rectangle) {             this.color = color;             this.rectangle = rectangle;         }          public void setrectangleorigin(double x, double y) {             rectangle                     .setrect(x, y, rectangle.getwidth(), rectangle.getheight());         }          public color getcolor() {             return color;         }          public rectangle2d getrectangle() {             return rectangle;         }      }  } 

Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -