2011-10-22 3 views
-1

의 인스턴스 인 panelJPanel이라는 위젯에서 녹색 원이 번쩍이는 패턴으로 대각선으로 이동하는 간단한 애니메이션을 만들려고합니다. 녹색 원이 번지게하는 방법은 무엇입니까?

JFrame

가되는 I 연속적 원의 x 및 y 좌표를 증분하면서 repaint 메소드를 호출하는 애니메이션 메소드를 호출합니다 ( actionPerformed 메소드를 호출하여 애니메이션을 시작하도록되어 누르는 시작 버튼을 가지고) 자체가 청취자 인 메인 클래스에있다.

대신 버튼을 누르면 원이 초기 좌표에 나타나고 지연 후 다른 원이 최종 좌표에 나타납니다. 누가 내가 잘못 가고 있는지 알아내는 데 도움을 줄 수 있습니까? 나는 자바에서 초보자 다. 몇 년 전에 C에서 몇 가지 기본적인 프로그래밍을 해왔다.

미리 감사드립니다. 여기 내 코드입니다 :

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

public class Smear implements ActionListener{ 
    JFrame frame; 
    MyPanel panel; 
    JButton button; 
    Smear animgui1; 
    int x=70; 
    int y=70; 

    public static void main(String[] args) { 
     Smear animgui=new Smear(); 
     animgui.project(); 
     animgui.set(animgui); 
    } 

    public void set(Smear anim) { 
     animgui1=anim; 
    } 

    public void project() { 
     frame=new JFrame(); 
     panel=new MyPanel(); 
     button=new JButton("Start"); 
     button.addActionListener(this); 
     frame.getContentPane().add(BorderLayout.NORTH, button); 
     frame.getContentPane().add(BorderLayout.CENTER, panel); 
     frame.setSize(300,300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void animate() { 
     while(x!=200) { 
      panel.repaint(); 
      x++; 
      y++; 
      System.out.println("++++"); 
      try { 
       Thread.sleep(50); 
      } 
      catch(Exception ex) {}; 
     } 
    } 

    public void actionPerformed(ActionEvent event) { 
     animgui1.animate(); 
    } 

    class MyPanel extends JPanel { 
     public void paintComponent(Graphics g) { 
      g.setColor(Color.green); 
      g.fillOval(x,y,40,40); 
     } 
    } 
} 

그러나 동시에, 나는 그 버튼 (I 버튼과 청취자에 관한 코드를 제거), 그리고 그것의에 의도 한 방식으로 작동하지 않고 다른 프로그램 SmearGui을 만들었습니다

; 원은 천천히 번짐 패턴으로 움직입니다. 그에 대한 코드는 다음과 같습니다

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

public class SmearGui{ 
    JFrame frame; 
    MyPanel panel; 
    //JButton button; 
    SmearGui animgui1; 
    int x=70; 
    int y=70; 

public static void main(String[] args){ 
     SmearGui animgui=new SmearGui(); 
     animgui.project(); 
     animgui.set(animgui); 
     animgui.animate(); 
} 
public void set(SmearGui anim){ 
     animgui1=anim; 
} 
public void project(){ 
     frame=new JFrame(); 
     panel=new MyPanel(); 
     //button=new JButton("Start"); 
     //button.addActionListener(this); 
     //frame.getContentPane().add(BorderLayout.NORTH, button); 
     frame.getContentPane().add(BorderLayout.CENTER, panel); 
     frame.setSize(300,300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
public void animate(){ 
    while(x!=200){ 
     panel.repaint(); 
     x++; 
     y++; 
     try{ 
     Thread.sleep(50); 
     } 
     catch(Exception ex){}; 
} 
} 
/*public void actionPerformed(ActionEvent event){ 
     animgui1.animate(); 
}*/ 
    class MyPanel extends JPanel{ 
     public void paintComponent(Graphics g){ 
     g.setColor(Color.green); 
     g.fillOval(x,y,40,40); 
} 
} 
} 

위의 코드는 메인 자체에 애니메이션 방법을 배치합니다.

+1

코드 들여 쓰기는 사람들이 코드를 읽을 때 코드를 이해하도록 돕기위한 것입니다. 우리는 * 우리가 그것을 읽고 싶어합니까? –

+1

'Thread.sleep (50);'그러지 마. Swing ['Timer'] (http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html)을 사용하십시오. –

+0

오 .. 정말 미안해 !! 지금부터는 그것을 돌볼 것입니다 ... 그리고 감사합니다 !!! 저는 방금 Java를 배우기 시작했습니다. 20-30 일 정도 지났습니다. 그리고 저는 그 모든 것을 ~ Swing Timer로 보지 못했습니다. – stonecoldjha

답변

1

repaint는 비동기식이므로 코드는 계속 진행하기 전에 패널을 다시 그리기를 기다리지 않습니다. 루프 코드는 패널을 다시 그리는 것보다 훨씬 빠릅니다. 다시 그리기와 동일한 스레드에서 실행되는 스윙 타이머를 사용하면 계산 타이밍과 그리기 타이밍에이 불일치가 생기지 않도록 할 수 있습니다.

+0

@ MeBigFatGuy 내가 편집 한 위의 게시물을 참조하십시오. Smear 프로그램의 전체 코드를 사용하여 SmearGui라는 다른 프로그램을 만들었지 만, 주석을 달고 버튼과 청취자의 코드를 적절히 제거했습니다. 그리고 원이 패널 대각선을 따라 움직이는 것처럼 번지면서 움직이는 것처럼 작동합니다. 그래서 그 버튼과 관련이있을 것입니다. – stonecoldjha

+0

@ user1008995 그것은 버튼이 아니며, 두 번째 버전에서는 애니메이션이 주 스레드에서 수행되며 이는 드로잉을 수행하는 스레드이기도합니다. – divegeek

관련 문제