首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用repaint()的动画

使用repaint()的动画
EN

Stack Overflow用户
提问于 2012-12-30 20:52:56
回答 3查看 3.5K关注 0票数 3

我正在尝试创建一个简单的动画,绘制随机矩形时,一个按钮被按下。到目前为止,我只需按一下按钮就可以创建矩形。我想进一步开发代码,这样当我按下按钮时,就会创建多个随机矩形。我试图创建一个for循环,它要求内部类重新绘制自己,但它仍然不起作用。有人能帮帮我吗?

代码语言:javascript
复制
    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);
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2012-12-30 21:02:17

repaint()简单地告诉Swing“当你有时间的时候,请重新绘制这个区域”。因此,如果您在循环中添加矩形,并在每次迭代时调用repaint,则所有矩形将仅在循环完成且action事件已处理后才会出现。

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

票数 3
EN

Stack Overflow用户

发布于 2012-12-30 21:12:46

您应该做的是将循环放在paintComponent方法中,而不是在循环中调用重绘。因此,您的paintComponent方法应该如下所示:

代码语言:javascript
复制
    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);
        }
    }

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

代码语言:javascript
复制
public void actionPerformed(ActionEvent event){
    frame.getContentPane().add(BorderLayout.CENTER, dp);
    frame.repaint();
    frame.getRootPane().revalidate();       
    dp.repaint();
}
票数 0
EN

Stack Overflow用户

发布于 2012-12-30 21:44:54

好吧,在这里我做了一个简短的EG,用于you.It在随机屏幕位置上显示随机矩形,随机时间。(根据您的要求,您可以设置自己的随机化值和屏幕位置的最大界限。)

还要注意的是

代码语言:javascript
复制
            int i=(int)(Math.random()*10);

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

             for(;i<j;i++)

其中有时I可能大于j.So,循环可能不能根据您的需要在一个或两个cliks.Change上工作。

以下是工作代码:

代码语言:javascript
复制
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) { }

   } 

  } 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14090857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档