开发者

Java swing drawing: how to clear background when animating object

I've written some java swing code that animates some balls in a JPanel using a Timer and some other crap, and it doesn't refresh the background, so it has a streaking effect (I don't know what to call it). How could I go about fixing this? Also, how do I select best answer? Thanks dudes. This is the pertinent code:

public void paintComponent(Graphics g){

     super.paintComponents(g);
             for (Particle b: ballArr){
                  g.setColor(b.getColor());
                  g.fillOval(b.getXCoor(),b.getYCoor(),
                             b.getTheSize(),b.getTheSize());
             }
        }

    class TimerListener implements ActionListener {
                public void actionPerformed(ActionEvent e){
                     for (Particle b: ballArr)
                         b.move();
                     setBackground(Color.WHITE);
                     repaint();

                }

and the full code:

import java.util.Random;
import java.util.ArrayList;
import java.awt.Color;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
public class Ball extends JApplet{

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setTitle("And so the ball rolls");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                initContainer(frame);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
    public static void initContainer(Container container){

       GraphicsPanel graphicsPanel = new GraphicsPanel();
       MainPanel mainPanel = new MainPanel(graphicsPanel);
       container.add(mainPanel);
       graphicsPanel.startTimer();

    }
//
//    @Override
//    public void init(){
//        initContainer(this);
//    }
}
    ///////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////
    class MainPanel extends JPanel {
        JLabel label = new JLabel("Particles");
        GraphicsPanel gPanel;

        public MainPanel(GraphicsPanel gPanel){
            this.gPanel = gPanel;
            add(gPanel);
            add(label);
        }
}
    ///////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////
    class GraphicsPanel extends JPanel implements MouseListener {

        private ArrayList<Particle> ballArr = new ArrayList<Particle>();
        private String state="p";         //"s"=spiral, "p"=particle
        private int speed=50;             //~20 Hz
        private Timer timer;

        public GraphicsPanel(){
            System.out.println("echo from gpanel");
            setPreferredSize(new Dimension(600,500));
            timer = new Timer(speed, new TimerListener());
            addMouseListener(this);
        }

        public void startTimer(){
            timer.start();
        }

        @Override
        public void paintComponent(Graphics g){

            super.paintComponents(g);
             for (Particle b: ballArr){
                  g.setColor(b.getColor());
                  g.fillOval(b.getXCoor(),b.getYCoor(),
                             b.getTheSize(),b.getTheSize());
             }
        }

        public void mousePressed(MouseEvent e) {
            System.out.println("becho");
            ballArr.add(new Particle(e.getX(), e.getY(), "p"));
        }
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
        public void mouseClicked(MouseEvent e) {}

        class TimerListener implements ActionListener {
            public void actionPerformed(ActionEvent e){
                 for (Particle b: ballArr)
                     b.move();
                 setBackground(Color.WHITE);
                 repaint();

            }
        }
 }

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class Particle
{
    private static int instanceCount; {{instanceCount++;}}
    private int z = 11, t=1, u=1;
    private int[] RGB = new int[3];
    private int[] randomizeColor = new int[3];
    private double radius, theta;
    private int x, y, centerX, centerY, size, spiralDirection=1,
                ballSizeLowerBound, ballSizeUpperBound,
                radiusLowerBound, radiusUpperBound,
                mouseInputX,开发者_StackOverflow中文版 mouseInputY,
                radiusXMultiplier, radiusYMultiplier;
    private Color color;
    private String state;
    private Random random = new Random();
    ///////////////////////////////////////////////////////////////////////////
    public Particle(int x, int y, int centerX, int centerY, int radius,
                int theta, int size, Color color){
        this.x=x;this.y=y;this.centerX=centerX;this.centerY=centerY;
        this.radius=radius;this.theta=theta;this.size=size;this.color=color;
    }

    public Particle(int mouseInputX, int mouseInputY, String state){
        this.mouseInputX=mouseInputX;
        this.mouseInputY=mouseInputY;
        this.state=state;
       //randomize color
        RGB[0] = random.nextInt(255);
        RGB[1] = random.nextInt(255);
        RGB[2] = random.nextInt(255);
        randomizeColor[0] = 1+random.nextInt(3);
        randomizeColor[0] = 1+random.nextInt(3);
        randomizeColor[0] = 1+random.nextInt(3);
        centerX=mouseInputX;
        centerY=mouseInputY;
        if (state.equals("s")){ //setup spiral state
            ballSizeLowerBound=5;
            ballSizeUpperBound=18;
            radiusLowerBound=0;
            radiusUpperBound=50;
            radiusXMultiplier=1;
            radiusYMultiplier=1;
        }
        if (state.equals("p")){ //setup particle state
            ballSizeLowerBound = 15;
            ballSizeUpperBound =20 + random.nextInt(15);
            radiusLowerBound = 5;
            radiusUpperBound = 15+ random.nextInt(40);
            radiusXMultiplier=1 + random.nextInt(3);
            radiusYMultiplier=1 + random.nextInt(3);
        }

        size = ballSizeUpperBound-1; //ball size
        radius = radiusUpperBound-1;

        if (instanceCount %2 == 0) // alternate spiral direction
            spiralDirection=-spiralDirection;
    }
    ///////////////////////////////////////////////////////////////////////////
    public int getXCoor(){return centerX+x*spiralDirection;}
    public int getYCoor(){return centerY+y;}
    public int getTheSize(){return size;}
    public Color getColor(){return color;}
    //////////////////////////////////////////////////////////////////////////
    void move(){

            //spiral: dr/dt changes at bounds
            if (radius > radiusUpperBound || radius < radiusLowerBound)
                u = -u;

            //spiral shape formula: parametric equation for the
            //polar equation radius = theta
            x = (int) (radius * radiusXMultiplier * Math.cos(theta));
            y = (int) (radius * radiusYMultiplier * Math.sin(theta));

            radius += .3*u;
            theta += .3;

            //ball size formula
            if (size == ballSizeUpperBound || size == ballSizeLowerBound)
                t = -t;
            size += t;

            //ball colors change
            for (int i = 0; i < RGB.length; i++)
                if (RGB[i] >= 250 || RGB[i] <= 3)
                    randomizeColor[i] = -randomizeColor[i];

            RGB[0]+= randomizeColor[0];
            RGB[1]+= randomizeColor[1];
            RGB[2]+= randomizeColor[2];
            color = new Color(RGB[0],RGB[1],RGB[2]);
    }
}


super.paintComponents(g); should be super.paintComponent(g);

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜