Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9289991
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 18, 20262026-06-18T20:18:41+00:00 2026-06-18T20:18:41+00:00

I am trying to display two rotating wheels with diameter 512untis at different rates

  • 0

I am trying to display two rotating wheels with diameter 512untis at different rates but i am not able to remove the previous drawn image graphics and set the rotated graphics at the correct position.
For now i am doing a rotation with arbitrary angle.
I tried affineTransform and got the rotations but it was weird like all pixels spread away.
Im using a while loop with thread.sleep(). The following is the code :
//The drawSmallCircle and drawBigCircle return two images.

class MyFramePart2 extends JFrame

{ 

    String name;
    JPanel big_obj_panel,small_obj_panel;    
    JLabel bigLabel,smallLabel;BufferedImage imgRet,imgRetSmall;
    static double radians,angle,rev,fps,smallAngle,smallRadians;               
    int numLines,i=0;    

    MyFramePart2(String frameName,int numStrokes,double revolutions,double frameps)
    {       
        numLines=numStrokes;
        smallAngle=smallRadians=angle=radians=Math.toRadians(360/numLines);        
        rev=revolutions;
        fps=frameps; 

        setSize(1240,720);       
        setLocation(0,0);
        setLayout(null); 
        getContentPane().setBackground(Color.WHITE);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        big_obj_panel=new JPanel();
        big_obj_panel.setLayout(null);
        big_obj_panel.setSize(512,512);
        big_obj_panel.setLocation(100,100); 
        big_obj_panel.setBackground(Color.white);
        add(big_obj_panel);   


        imgRet=drawBigCircle();
        bigLabel = new JLabel(new ImageIcon(imgRet));
        bigLabel.setLayout(null);        
        bigLabel.setLocation(0,0);
        bigLabel.setSize(512,512);
        bigLabel.setOpaque(true);
        bigLabel.setBackground(Color.white);  
        big_obj_panel.add(bigLabel);

        small_obj_panel=new JPanel();
        small_obj_panel.setLayout(null);
        small_obj_panel.setSize(512,512);
        small_obj_panel.setLocation(700,100); 
        small_obj_panel.setBackground(Color.white);
        add(small_obj_panel);   

        imgRetSmall=drawSmallCircle();

        smallLabel = new JLabel(new ImageIcon(imgRetSmall));
        smallLabel.setLayout(null);        
        smallLabel.setLocation(0,0);
        smallLabel.setSize(512,512);
        smallLabel.setOpaque(true);
        smallLabel.setBackground(Color.white);  
        small_obj_panel.add(smallLabel);

        setVisible(true);               

        while(i!=5) // suppose to be while true, just checking 
      {                 
        setVisible(true);          
        bigLabel.setIcon(new ImageIcon(imgRet));         
        smallLabel.setIcon(new ImageIcon(imgRetSmall));
        try{
        Thread.sleep(10);        
        }
        catch(Exception e)
        {}
        i++;               
     }                         
 }

    @Override
    public void paint(Graphics g)
    {        
        super.paint(g);
        Graphics2D g2d=(Graphics2D)g;           
        g2d.translate(256,256);
        g2d.rotate(Math.toRadians(20));                       
        g2d.translate(-256,-256); 
        g2d.drawImage(imgRet,0,0,null);
        g2d.dispose();        

        super.paint(g);
        g2d=(Graphics2D)g;
        g2d.translate(256,256);
        g2d.rotate(Math.toRadians(30));
        g2d.translate(-256,-256);        
        g2d.drawImage(imgRetSmall,0,0,null);        
        g2d.dispose();
    }

    public static BufferedImage drawBigCircle()
    {
        BufferedImage img=new BufferedImage(512,512,BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d=img.createGraphics();                
        g2d.setColor(Color.black);
        g2d.drawOval(0,0,511,511);

        Line2D l2d;
        while(angle <= 2*Math.PI)
        {
            l2d=new Line2D.Double(256,256,256+256*Math.cos(angle),256+256*Math.sin(angle));
            g2d.draw(l2d);
            angle=angle+radians;
        }               
        return img;
    }        
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-18T20:18:42+00:00Added an answer on June 18, 2026 at 8:18 pm

    First rule of Swing. Don’t block the Event Dispatching Thread. Doing so will make you application look like it’s hung and prevent the EDT from processing any repaint requests.

    This means, you need some way to schedule updates that doesn’t block the EDT

    Second rule of Swing. Don’t create or modify any UI component from any thread other then the EDT.

    Generally, you should avoid overriding the paint method of top level containers like JFrame, apart from everything else, they’re not double buffered, meaning your painting will flicker as it’s updated. Instead, you should use one of the Swing containers, like JPanel

    There are lots of different ways to achieve this. Basically, here I’ve used three lists, but if I was serious, I would create an object that could maintain all the required information (image, angle an delta)

    In order to achieve the actual animation, I’ve used a javax.swing.Timer. This will trigger an event at least every n periods, but more importantly, it does it within the context of the Event Dispatching Thread. This ensures that all the changes made to the angles are done in way that will prevent any possibility of painting occurring while we’re updating the values…

    This example rotates the three images at different (random) speeds…

    enter image description here

    public class TestRotation {
    
        public static void main(String[] args) {
            new TestRotation();
        }
    
        public TestRotation() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new AnimationPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public class AnimationPane extends JPanel {
    
            private List<BufferedImage> images;
            private List<Double> angles;
            private List<Double> speed;
    
            public AnimationPane() {
                images = new ArrayList<>(5);
                images.add(createWheel(50, 4));
                images.add(createWheel(50, 3));
                images.add(createWheel(50, 6));
                angles = new ArrayList<>();
                speed = new ArrayList<>();
                for (int index = 0; index < images.size(); index++) {
                    angles.add(0d);
                    speed.add(Math.random() * 5d);
                }
    
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        for (int index = 0; index < angles.size(); index++) {
                            double angle = angles.get(index);
                            double delta = speed.get(index);
                            angle += delta;
                            angles.set(index, angle);
                        }
                        repaint();
                    }
                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                int x = 0;
                int y = 0;
                for (int index = 0; index < images.size(); index++) {
                    BufferedImage image = images.get(index);
                    double angle = angles.get(index);
    
                    // This is important.  Basically we going to grab a isolated snap shot
                    // of the current graphics context.  This means any changes we make
                    // will not affect the original graphics context (other then painting)
                    Graphics2D g2d = (Graphics2D) g.create();
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    AffineTransform at = new AffineTransform();
                    at.translate(x, y);
                    at.rotate(Math.toRadians(angle), image.getWidth() / 2, image.getHeight() / 2);
                    g2d.setTransform(at);
                    g2d.drawImage(image, 0, 0, this);
                    g2d.dispose();
    
                    x += image.getWidth();
    
                }
            }
    
        }
    
        protected Point2D calculateOutterPoint(int radius, double angel) {
    
            int x = Math.round(radius / 2);
            int y = Math.round(radius / 2);
    
            double rads = Math.toRadians((angel + 90));
    
            // This determins the length of tick as calculate from the center of
            // the circle.  The original code from which this derived allowed
            // for a varible length line from the center of the cirlce, we
            // actually want the opposite, so we calculate the outter limit first
            double fullLength = (radius / 2d);
    
            // Calculate the outter point of the line
            double xPosy = (x + Math.cos(rads) * fullLength);
            double yPosy = (y - Math.sin(rads) * fullLength);
    
            return new Point2D.Double(xPosy, yPosy);
    
        }
    
        public BufferedImage createWheel(int radius, int spokes) {
            BufferedImage img = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = img.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.black);
            g2d.drawOval(0, 0, radius - 1, radius - 1);
    
            Point2D center = new Point2D.Double(radius / 2d, radius / 2d);
            double angle = 360d / spokes;
            for (int index = 0; index < spokes; index++) {
                Point2D p = calculateOutterPoint(radius, index * angle);
                g2d.draw(new Line2D.Double(center, p));
            }
    
            g2d.dispose();
            return img;
    
        }
    
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I've being trying to display two graphics in one screen but I'm not able.
I'm trying to display a page in NSIS to obtain two different values. I
Im trying to display two list: one for categories and brand but only the
Hello I am trying to display two different html pages through the same UIViewController
I'm trying to display two <div> elements on the same line, but in the
I'm trying to display data from two different tables in mysql using PHP and
I am trying to format a string to display two columns for a high
I am trying to make web page which would display two other webpages side
I am developing a metro app using JavaScript and am trying to display two
I'm trying display random data from database into two textviews (TextView1 display NAME, TextView2

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.