【问题标题】:Using JButton to start simple animation [duplicate]使用JButton开始简单的动画[重复]
【发布时间】:2015-05-02 10:41:27
【问题描述】:

我正在关注 HeadFirst Java 2nd Edition 并尝试执行一个简单的动画,即单击一个按钮即可从一个点斜向另一个点移动一个圆圈。 我正在使用 JPanel 绘制圆圈和 ActionListener 接口以从按钮获取事件。 当我直接从 '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();
            }
        }
}

【问题讨论】:

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


【解决方案1】:

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

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

我推荐谷歌搜索“Java 中的动画”,那里有几个网站可以详细解释。

【讨论】:

  • 谢谢,我去看看
  • 谢谢朋友!!,我不得不使用计时器来修复它!
  • "然后有效地立即执行",不太确定!无论您在 actionPerformed() 中调用 .repaint() 多少次,都只会执行一次重绘。
【解决方案2】:

我发现您在 SimpleAnimation 类中声明了 animate() 函数,但您在 OnclickListener 类中调用该函数。这是不可能的。当在方法actionPerformed 中的类OnclickListener 中调用函数animate() 这意味着this.animate()。所以程序会尝试在OnclickListener 类中定位animate() 函数,该函数找不到,应该会产生编译错误。

为了做你想做的事,你必须将SimpleAnimation 的引用传递给OnclickListener 类的变量,比如simpleAnimation,然后调用simpleAnimation.animate(),它应该可以工作。

【讨论】:

  • 代码运行良好。我使用内部类,这就是代码运行的原因。
猜你喜欢
  • 2014-10-31
  • 2021-08-23
  • 2011-10-04
  • 2016-06-22
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多