Java 我的ActionListener正在破坏我的动画吗?
我在大学里学习java课程,我有一个期末项目,在这个项目中,我必须在按下Jbutton时开始制作动画。我有一个菜单类和一个动画类。我可以从菜单类中的任何位置播放动画,但从动作侦听器播放动画时除外,然后代码会运行,但动画不会显示。这是一个物理模拟,所以我可以在终端上看到我打印出来的所有数学结果,但在动画的最后一帧之前,帧一直保持空白。Java 我的ActionListener正在破坏我的动画吗?,java,swing,jbutton,actionlistener,stddraw,Java,Swing,Jbutton,Actionlistener,Stddraw,我在大学里学习java课程,我有一个期末项目,在这个项目中,我必须在按下Jbutton时开始制作动画。我有一个菜单类和一个动画类。我可以从菜单类中的任何位置播放动画,但从动作侦听器播放动画时除外,然后代码会运行,但动画不会显示。这是一个物理模拟,所以我可以在终端上看到我打印出来的所有数学结果,但在动画的最后一帧之前,帧一直保持空白。 我正在使用提供给我们的名为“标准绘图”的绘图和动画库,它似乎也使用Swing。我尝试过不同类型的听众,但都不管用。有人有什么建议吗 StdDraw链接: 以下是我认
我正在使用提供给我们的名为“标准绘图”的绘图和动画库,它似乎也使用Swing。我尝试过不同类型的听众,但都不管用。有人有什么建议吗 StdDraw链接: 以下是我认为我目前使用的代码的相关部分:
(课堂菜单) (课内摆锤)
公共摆锤(整数N,双m,双l,双a){
输入(N、m、l、a);
画布();
制作动画();
}
--------------------------------------------------------------------------------------------------------
公共静态无效动画(){
StdDraw.enabledDoubleBuffering();
对于(双t=0;t<100;t+=FRAME\u t/1000.0){
…(我所有的数学和绘画)。。。
StdDraw.show();
暂停(第T帧);
StdDraw.clear();
}
StdDraw.disableDoubleBuffering();
}
因为我只有在播放来自听众的动画时才会遇到问题。-侦听器的代码调用在事件调度线程(EDT)上执行,这意味着GUI在代码执行完成之前无法响应事件或重新绘制自身。您应该为动画使用摆动计时器。参见:了解基本示例。因此,您需要两个ActionListener,一个用于启动计时器的按钮,另一个用于计时器。或:用于反弹球动画。
new MouseListener() {
public void mousePressed(MouseEvent e) {
started();
};
public void mouseReleased(MouseEvent e) {};
public void mouseClicked(MouseEvent e) {};
public void mouseEntered(MouseEvent e) {
start.setBackground(Color.blue);
};
public void mouseExited(MouseEvent e) {
start.setBackground(Color.red);
};
--------------------------------------------------------------------------------------------------------
public static void started(){
getNums();
try{
clicked = false;
N = Integer.parseInt(n);
M = Double.parseDouble(m);
L = Double.parseDouble(l);
A = Double.parseDouble(a);
f.dispose();
pend = new Pendulum(N, M, L, A);
}
catch(Exception NumberFormatException){
clicked = false;
error();
}
}
public Pendulum(int N, double m, double l, double a) {
input(N, m, l, a);
canvas();
animate();
}
--------------------------------------------------------------------------------------------------------
public static void animate(){
StdDraw.enableDoubleBuffering();
for (double t = 0; t < 100; t += FRAME_T/1000.0) {
...(ALL OF MY MATH AND DRAWING)...
StdDraw.show();
StdDraw.pause(FRAME_T);
StdDraw.clear();
}
StdDraw.disableDoubleBuffering();
}