为什么我的动画不可见?

时间:2015-06-21 17:55:30

标签: java swing animation

所以这是我的代码:

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

public class Frame {

Draw d = new Draw();

JFrame f1 = new JFrame("Animation 2");
JButton bMoveRight = new JButton(">>>>");
JButton bMoveLeft = new JButton("<<<<");

public Frame() {

    f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f1.setSize(800, 600);
    f1.setVisible(true);
    f1.setResizable(false);
    f1.setLocationRelativeTo(null);

    bMoveRight.setBounds(50, 450, 120, 50);
    bMoveLeft.setBounds(600, 450, 120, 50);

    f1.add(bMoveRight);
    f1.add(bMoveLeft);

    f1.add(d);

    bMoveRight.addActionListener(new ButtonMoveRight());
    bMoveLeft.addActionListener(new ButtonMoveLeft());

    }

    private class ButtonMoveRight implements ActionListener {
        public void actionPerformed(ActionEvent e){
            d.animateRight();
        }
    }

    private class ButtonMoveLeft implements ActionListener {
        public void actionPerformed(ActionEvent e){
            d.animateLeft();
        }
    }

}

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

public class Draw extends JComponent{

int x = 50;

public void paint(Graphics g){  
    g.setColor(Color.BLACK);
    g.fillRect(x, 150, 200, 100);
}

public void animateLeft(){
    try{
        while(x != 50){
            x--;
            repaint();
            Thread.sleep(10);
        }
    } catch(Exception ex){
        ex.printStackTrace();
    }
}

public void animateRight(){
    try{
        while(x != 550){
            x++;
            repaint();
            Thread.sleep(10);
        }
    } catch(Exception ex){
        ex.printStackTrace();
    }
}
}

一切都按预期运作。除了一件事。我的动画发生但问题是它没有显示。我制作了另一个程序,其中只有动画,它立即开始,但在这一个我做了按钮开始动画。发生的事情是我点击按钮并且5秒内没有任何事情发生(它需要到达另一侧的时间),并且在5秒后它出现在窗口的另一侧。为什么赢得我的动画节目?

1 个答案:

答案 0 :(得分:2)

你的&#34; ActionListener&#34;中的Thread.sleep()强烈建议不要回调。问题如下:您的代码在同一个线程中调用,该线程是GUI应用程序的主线程 - 它用于绘制您的界面。

您需要做什么而不是sleep()调用 - 您可以使用延迟和正确处理方式触发某些事件。你必须使用像计时器这样的东西 - 可能就是这个https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html