저는 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();
}
}
}
repaint () 호출은 다시 그리기 요청을 대기열에 넣습니다. 즉시 화면을 다시 칠한다고 생각할 수 있습니다. 귀하의 요청은 모두이 대기열에 쌓여서 실행되기를 기다리고 있으며 사실상 모두 한꺼번에 실행됩니다.
서로 다른 애니메이션 사이에 거리를 두려면 Thread.sleep () 호출이 아닌 타이머가 필요합니다. java.util에 제공되는 타이머가 있지만 대신 Swing에서 타이머를 사용해야합니다.
자세한 내용을 설명하는 여러 사이트가있는 "Java의 애니메이션"에 대한 Google 검색을 권장합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다