java - 使用JButton启动简单动画

标签 java swing animation event-dispatch-thread thread-sleep

我正在关注HeadFirst Java 2nd Edition,并尝试通过单击按钮来执行一个简单的动画,该动画是一个圆从一个点对角线移动到另一个点。 我正在使用 JPanel 绘制圆圈,并使用 ActionListener 接口(interface)从按钮获取事件。 当我直接从 'main()' 调用 animate 函数时,动画工作正常。但是当我在单击按钮后尝试这样做时,程序卡住并直接显示最终结果。

代码:

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

    public class SimpleAnimation{
    int x=70;
    int y=70;
    JFrame frame;
    MyDrawPanel drawPanel;

    public static void main(String[] args) {
        SimpleAnimation gui=new SimpleAnimation();
        gui.initialize();
        // gui.animate();               //animation method
    }

    public void initialize(){
        frame=new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        drawPanel=new MyDrawPanel();
        frame.getContentPane().add(BorderLayout.CENTER,drawPanel);
        frame.setSize(400,400);
        frame.setVisible(true);
        JButton button=new JButton("Click me!");
        frame.getContentPane().add(BorderLayout.EAST,button);
        button.addActionListener(new OnclickListener());
    }

    public void animate(){
        for (int i=0;i<130 ;i++ ) {
            x++;
            y++;
            drawPanel.repaint();
            try{
                Thread.sleep(50);
                }catch(Exception e){}
            }
        }

        class MyDrawPanel extends JPanel{
            public void paintComponent(Graphics g){
                g.setColor(Color.white);
                g.fillRect(0,0,this.getWidth(), this.getHeight());
                g.setColor(Color.green);
                g.fillOval(x,y,40,40);
            }
        }

        class OnclickListener implements ActionListener{
            public  void actionPerformed(ActionEvent event){
                animate();
            }
        }
}

最佳答案

对 repaint() 的调用将重绘请求放入队列中;您可能会认为它会立即重新绘制屏幕。您的请求都堆积在这个队列中等待执行,然后实际上所有请求都立即执行。

您需要一个计时器,而不是调用 Thread.sleep() 来放置不同动画之间的距离。 java.util 中提供了一个计时器,但您应该使用 Swing 中的计时器。

我建议在谷歌上搜索“animation in Java”,其中有几个网站详细解释了事情。

关于java - 使用JButton启动简单动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30001306/

相关文章:

java - String.format 在控制台中工作但在 JOptionPane 中不起作用

html - CSS 动画打字

objective-c - 平移/滑动 View ,如相机锁屏

java - 为什么 Java 必须抛出并发修改异常?

java - 从父目录调用 java 类

java - 如何编辑 JFXSpinner 内部文本

java - 在 Swing JAVA 中刷新表模型或 GUI

iphone - 如何停止 UIScrollView 调用 drawRect : on sublayers that go in/out of the visible region?

java - 在 Apache Flink 中将多个数据集传输到下一次迭代

java - Spring 没有在响应中设置 statusText