java - 使用 repaint() 的动画

标签 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);
        }
    }
}

最佳答案

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

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

关于java - 使用 repaint() 的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090857/

相关文章:

java - 将 xml 转换为可视化 Swing 树的库?

java - 使用接收 List<Project> 的 Web 服务在 Java 中填充 JTable

html - 使用vertical-align将按钮在div内垂直居中

java - 在spring中实现调度器(由用户定义)

java - m2eclipse 依赖版本不是最新的

java - 2 年日期的 SimpleDateFormat 问题

框架上具有多个面板的 Java Swing 可滚动 JPanel

android - 在 android 4.4 中禁用硬件键(home、back、....)

button - 没有新按钮的 SonataAdminBundle 字段 sonata_type_model

java - Java 中的 map 接口(interface)