gpt4 book ai didi

java - 使用JButton启动简单动画

转载 作者:行者123 更新时间:2023-12-01 11:35:52 26 4
gpt4 key购买 nike

我正在关注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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com