Java 我的ActionListener正在破坏我的动画吗?

Java 我的ActionListener正在破坏我的动画吗?,java,swing,jbutton,actionlistener,stddraw,Java,Swing,Jbutton,Actionlistener,Stddraw,我在大学里学习java课程,我有一个期末项目,在这个项目中,我必须在按下Jbutton时开始制作动画。我有一个菜单类和一个动画类。我可以从菜单类中的任何位置播放动画,但从动作侦听器播放动画时除外,然后代码会运行,但动画不会显示。这是一个物理模拟,所以我可以在终端上看到我打印出来的所有数学结果,但在动画的最后一帧之前,帧一直保持空白。 我正在使用提供给我们的名为“标准绘图”的绘图和动画库,它似乎也使用Swing。我尝试过不同类型的听众,但都不管用。有人有什么建议吗 StdDraw链接: 以下是我认

我在大学里学习java课程,我有一个期末项目,在这个项目中,我必须在按下Jbutton时开始制作动画。我有一个菜单类和一个动画类。我可以从菜单类中的任何位置播放动画,但从动作侦听器播放动画时除外,然后代码会运行,但动画不会显示。这是一个物理模拟,所以我可以在终端上看到我打印出来的所有数学结果,但在动画的最后一帧之前,帧一直保持空白。
我正在使用提供给我们的名为“标准绘图”的绘图和动画库,它似乎也使用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();

   }