Я следую HeadFirst Java 2nd Edition и пытаюсь выполнить простую анимацию круга, движущегося по диагонали из одной точки в другую одним нажатием кнопки. Я использую JPanel для рисования круга и интерфейса ActionListener для получения события от кнопки. Когда я напрямую вызываю функцию анимации из 'main()', анимация работает нормально. Но когда я пытаюсь сделать это после нажатия кнопки, программа зависает и сразу отображает конечный результат.
Код:
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();
}
}
}
Timer
документацией. Вы не должны спать в потоке пользовательского интерфейса (или выполнять любую другую логику, не связанную с пользовательским интерфейсом), поскольку это заблокирует перерисовку вашего графического интерфейса. - person Piotrek Bzdyl   schedule 02.05.2015