动画使用重绘()

时间:2012-12-30 12:52:56

标签: java swing button actionlistener repaint

我正在尝试创建一个简单的动画,当按下按钮时,该动画会绘制随机矩形。到目前为止,我设法通过按下按钮创建矩形。我想进一步开发代码,这样当我按下按钮时,会创建多个随机矩形。我试图创建一个for循环,要求内部类重绘自己,但它仍然无法正常工作。请有人帮帮我。

    public class TwoButtonsRandomRec {

    JFrame frame;
    private int width = 500;
    private int height = 500;
    private DrawPanel dp;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }


    public static void main (String[] args)
    {   
        TwoButtonsRandomRec test = new TwoButtonsRandomRec(); 
        test.go();
    }

    public void go()
    {   
        dp = new DrawPanel();

        JButton start = new JButton("Start");
        start.addActionListener(new startListener());
        JButton stop = new JButton("Stop");
        stop.addActionListener(new stopListener());

        frame = new JFrame();
        frame.setSize(getWidth(), getHeight());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.NORTH, start);
        frame.getContentPane().add(BorderLayout.SOUTH, stop);
    }

    class startListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            frame.getContentPane().add(BorderLayout.CENTER, dp);
            frame.repaint();
            frame.getRootPane().revalidate();       
            for(int i=0; i<10; i++){
                dp.repaint();
            }
        }
    }

    class stopListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            System.out.println("stop");
        }
    }

    class DrawPanel extends JPanel{

        public void paintComponent(Graphics g){
            int w = 5+(int)(Math.random() * width-5);
            int h = 5+(int)(Math.random() * height-5);
            int maxX = width-w; // diffX & diffY are used to ensure that rectangle is
            int maxY = width-h; // draw completely inside the window
            int x = (int)(Math.random() * maxX);
            int y = (int)(Math.random() * maxY);
            Color color = new Color((int) (Math.random()*256), // random red
                    (int) (Math.random()*256), // random green
                    (int) (Math.random()*256));// random blue
            g.setColor(color);
            g.fillRect(x,y,w,h);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

repaint()只是告诉Swing“当你有空的时候,请重新粉刷这个区域”。因此,如果在循环中添加矩形并在每次迭代时调用重绘,则所有矩形将仅在循环结束后出现,并且已处理动作事件。

要制作动画,您需要在单独的线程中循环。最简单的方法是使用Swing Timer。启动“开始”按钮后,启动一个计时器,该计时器会添加一个随机矩形,并且每隔X毫秒调用repaint()。按下“停止”按钮后,停止计时器。

答案 1 :(得分:0)

你应该做的是将循环放在paintComponent方法中,而不是在循环中调用repaint。 所以你的paintComponent方法应如下所示:

    public void paintComponent(Graphics g){
        for (int i = 0; i < 10; i++) {
        int w = 5+(int)(Math.random() * width-5);
            int h = 5+(int)(Math.random() * height-5);
            int maxX = width-w; // diffX & diffY are used to ensure that rectangle is
            int maxY = width-h; // draw completely inside the window
            int x = (int)(Math.random() * maxX);
            int y = (int)(Math.random() * maxY);
            Color color = new Color((int) (Math.random()*256), // random red
                    (int) (Math.random()*256), // random green
                    (int) (Math.random()*256));// random blue
            g.setColor(color);
            g.fillRect(x,y,w,h);
        }
    }

您执行的操作应如下所示:

public void actionPerformed(ActionEvent event){
    frame.getContentPane().add(BorderLayout.CENTER, dp);
    frame.repaint();
    frame.getRootPane().revalidate();       
    dp.repaint();
}

答案 2 :(得分:0)

好吧,我在这里为你做了一个简短的EG。它随机显示随机时间矩形随机时间。 (您可以设置自己的随机化值,并根据您的要求设置最大界限。

enter image description here

还要注意

            int i=(int)(Math.random()*10);

             int j=(int)(Math.random()*10);

             for(;i<j;i++)

有时我可能会>因此,循环可能无法在一个或两个cliks上工作。根据您的需要进行更改。

以下是工作代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SimpleStamper extends JApplet {


  public void init() {

     Display display = new Display();
     setContentPane(display);
  }


  class Display extends JPanel implements MouseListener {

     Display() {

         setBackground(Color.black);
         addMouseListener(this);
     }

     public void mousePressed(MouseEvent evt) {


         if ( evt.isShiftDown() ) {

            repaint();
            return;
         }

         int x = evt.getX(); 
         int y = evt.getY();  

         Graphics g = getGraphics();  

            //***MODIFY THE FOLLOWING LINES****//   
             int i=(int)(Math.random()*10);
             int j=(int)(Math.random()*10);
             for(;i<j;i++)
             { g.setColor(Color.red);

               x=(int)(Math.random()*100);
               y=(int)(Math.random()*100);
             g.fillRect( x , y , 60, 30 );
             g.setColor(Color.black);
             g.drawRect(x , y , 60, 30 );}


         g.dispose();  
      } 
     public void mouseEntered(MouseEvent evt) { }
     public void mouseExited(MouseEvent evt) { }
     public void mouseClicked(MouseEvent evt) { }
     public void mouseReleased(MouseEvent evt) { }

   } 

  }