Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Cannot see intermediate steps in animation

Posted on 2011-02-28
7
968 Views
Last Modified: 2013-11-23
I am having trouble showing a simple animation in a Java application. I paint several circles separated by repaint and sleep requests but I only see the last one, not the intermediate ones. The attached code displays a single "circle" at (100,500). When the user clicks on the "Move" button I want it to show circles at (200,500), (300,500), and (400,500), separated by short delays. However I only see the last one. Probably a simple misconception on my part... Thanks.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SlowExample{

    private Mypanel mypanel;
    private JButton button;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(
          new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                SlowExample eg = new SlowExample();
                frame.setContentPane(eg.createContentPane());
                frame.setSize(800, 800);
                frame.setVisible(true);
            }
          }
        );
    }

    public JPanel createContentPane(){
        JPanel contentPane = new JPanel(new BorderLayout()); 
                
        mypanel = new Mypanel();         
        contentPane.add(mypanel, "Center");

        button = new JButton("Move");
        button.addActionListener(new ButtonHandler(mypanel));
        contentPane.add(button, "South");
        
        return contentPane;
    }
} // end of class SlowExample

class ButtonHandler implements ActionListener {
    private Mypanel mypanel;
    public ButtonHandler(Mypanel mypanel) {
        this.mypanel = mypanel;
    }

    public void actionPerformed(ActionEvent e) {    
    	AbstractButton b = (AbstractButton) e.getSource();
        if (b.getText().equals("Move") ) {
            mypanel.move();
        } else 
        	System.err.println("Unknown source "+b.getText());
    }
} // end of ButtonHandler

class Mypanel extends JPanel{
    private Point p = new Point(100,500);

    public void paintComponent(Graphics g) { 
        super.paintComponent(g);
        int height = getSize().height;
        g.setColor(Color.red);
        g.fillOval(p.x-2, (height - p.y)-2, 8, 8);
    }

    public void move() {
    	p = new Point(200,500);
        repaint();
        try{Thread.sleep(500);} catch (InterruptedException e){};
    	p = new Point(300,500);
        repaint();
        try{Thread.sleep(500);} catch (InterruptedException e){};
        p = new Point(400,500);
        repaint();
    }     
} // end of Mypanel

Open in new window

0
Comment
Question by:reallygorgo
  • 4
  • 3
7 Comments
 
LVL 92

Accepted Solution

by:
objects earned 500 total points
ID: 35003159
Swing is single threaded so you need to control your animation in a separate thread
http://helpdesk.objects.com.au/java/how-do-i-update-my-gui-from-any-thread
0
 

Author Comment

by:reallygorgo
ID: 35003375
I was afraid it was something like that. So does it make sense to think about spinning off a thread in my move method? I replaced my move method with the following, which seemed to work as I had hoped. Is there a better way? Can you explain what was going wrong  before? I guess I was sleeping the Event Dispatching thread?
public void move() {
    	Thread t = new Thread(new Runnable() {public void run() {    	
    		p = new Point(200,500);
    		repaint();
    		try{Thread.sleep(500);} catch (InterruptedException e){};
    		p = new Point(300,500);
    		repaint();
    		try{Thread.sleep(500);} catch (InterruptedException e){};
    		p = new Point(400,500);
    		repaint();}});
    	t.start();
    }

Open in new window

0
 
LVL 92

Expert Comment

by:objects
ID: 35003424
that looks better

> Can you explain what was going wrong  before? I guess I was sleeping the Event Dispatching thread?

correct. one thread handles updating the gui. so when you sleep no updates would occur.
0
Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

 
LVL 92

Expert Comment

by:objects
ID: 35003431
whether thats the best way or not depends on what you are ultimately trying to achieve.
How you have it currently it will spawn a new thread each time the button is pressed.
0
 

Author Comment

by:reallygorgo
ID: 35003465
wrong comment accepted
0
 

Author Closing Comment

by:reallygorgo
ID: 35003467
Thanks for your help.
0
 

Author Comment

by:reallygorgo
ID: 35003489
> How you have it currently it will spawn a new thread each time the button is pressed

I guess that a more conventional approach would be to organise things up front.. eg. along the lines of the Model-View-Controller pattern.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

How to remove superseded packages in windows w60 or w61 installation media (.wim) or online system to prevent unnecessary space. w60 means Windows Vista or Windows Server 2008. w61 means Windows 7 or Windows Server 2008 R2. There are various …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question