2014-02-15 2 views
0

최근의 모든 애니메이션 프로젝트에이 문제가 계속 발생합니다. 애니메이션을 실행할 때마다 완전히 눈에 띄지 않고 꽉 차있는 것처럼 보이지 않지만 완전히 깜박 거리지 않는 전구와 비슷하게 깜박 거리고 깜박입니다 (이상한 비교는 알지만 다른 점은 생각할 수 없습니다). 유사). 나는 그것이 내 repaint()의 나의 배치와 관련이 있어야하는 것처럼 느낀다. 그러나 나는이 시점에서 확실하지 않다. 내가 만든 이전 애니메이션에서, 문제는 "개인 BufferedImage offScr"변수가 올바르게 설정되지 않았지만 현재 작업중인 것과 유사한 다른 프로그램을 보는 것 때문에 그 변수가 왜 필요한지 알 수 없습니다. 모든 도움을 주셔서 감사합니다. 프로그래밍 어휘에 대한 지식 부족에 대해 사과드립니다.애니메이션 깜박임

당신의 재 페인트 중 하나가 될 것으로 보인다 네
import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 

public class DoveAnimator extends JFrame implements ActionListener { 
    private int DELAY = 40; // the delay for the animation 
    private final int WIDTH = 400; // the window width 
    private final int HEIGHT = 180; // the window height 




    private final int IMAGEAMT = 8; 
    private Image [] doveLeft = new Image[IMAGEAMT]; 
    private Image [] doveRight = new Image[IMAGEAMT]; 
    private int doveIndex = 0; 
    private boolean isRight = true; 


    private JPanel dovePanel; 
    private Image dove; 

    private JButton slowerButton = new JButton ("Slower"); 
    private JButton fasterButton = new JButton ("Faster"); 
    private JButton reverseButton = new JButton ("Reverse"); 
    private JButton pauseResumeButton = new JButton (" pause "); 
    private Timer timer; 
    private int clicks = 2; 

    private boolean pause = false; 

    /** The constructor */ 
    public DoveAnimator() { 
     MediaTracker track = new MediaTracker(this); 
     for (int i = 0; i < IMAGEAMT; ++i) { 
      doveLeft[i] = new ImageIcon("doves/ldove" + (i+1) + ".gif").getImage(); 
      doveRight[i] = new ImageIcon("doves/rdove" + (i+1) + ".gif").getImage(); 
      track.addImage(doveLeft[i],0); 
      track.addImage(doveRight[i],0); 
     } 
     // dove = doveRight[0]; 
     //track.addImage(bkgImage,0); 
     // track.addImage(dove,0); 

     try { 
      track.waitForAll(); 
     } catch (InterruptedException e) { } 
     dove = doveRight[0]; 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setTitle ("Dove Animator"); 

     dovePanel = new JPanel(); 
     dovePanel.setPreferredSize(new Dimension(100, 125)); 
     dovePanel.setBackground(Color.WHITE); 

     mainPanel.add(dovePanel); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setPreferredSize(new Dimension(WIDTH, 40)); 

     // button 1 
     slowerButton.addActionListener (this); 
     buttonPanel.add (slowerButton); 

     // button 2 
     fasterButton.addActionListener (this); 
     buttonPanel.add (fasterButton); 

     // button 3 
     reverseButton.addActionListener (this); 
     buttonPanel.add (reverseButton); 

     // button 4 
     pauseResumeButton.addActionListener (this); 
     buttonPanel.add (pauseResumeButton); 

     mainPanel.add(buttonPanel); 
     add(mainPanel); 

     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     setVisible (true); 
     pack(); 



     timer = new Timer(DELAY,this);  // setting timer delay 
     timer.start();      // start the timer 


    } 
    public void switchDove() { 
     ++doveIndex; 
     if (doveIndex >= IMAGEAMT) 
      doveIndex = 0; 

     if (isRight) 
      dove = doveRight[doveIndex]; 


     else 
      dove = doveLeft[doveIndex]; 

     dove = (isRight) ? doveRight[doveIndex] : doveLeft[doveIndex]; 

     } 





    /** Handler for button clicks and timer events */ 
    public void actionPerformed (ActionEvent evt) { 




     if (evt.getSource() == slowerButton) 
     { 
      DELAY += 10; 

     } 
     else if (evt.getSource() == reverseButton) 
     { 
      if(evt.getSource() == reverseButton && isRight == true){ 
       isRight = false; 

      } 
      else if(evt.getSource() == reverseButton && !isRight){ 
       isRight = true; 
      } 


     } 
     else if (evt.getSource() == fasterButton) 
     { 
      DELAY -= 10; 
      if (DELAY <= 10){ 
       DELAY = 10; 
      } 


     }     
     else if (evt.getSource() == pauseResumeButton) 
     {  
      if(evt.getSource() == pauseResumeButton && !pause){ 
       pauseResumeButton.setText(" Resume "); 
       timer.stop(); 
       pause = true; 

      } 
      else if(evt.getSource() == pauseResumeButton && pause == true){ 
       pauseResumeButton.setText(" Pause "); 
       timer.start(); 
       pause = false; 
      } 




     }   
     else if (evt.getSource() == timer) 
     { 
      drawAnimation(); 
      switchDove(); 
      repaint(); 

     } 


    } 



    /** Draws the dove in the dovePanel */ 
    public void drawAnimation() { 
     Graphics page = dovePanel.getGraphics(); 
     page.drawImage(dove,0,0,Color.WHITE,null); 
    } 

    /** The main method */ 
    public static void main (String [] args) { 
     new DoveAnimator(); 
    } 
} 

답변

0

()가 호출

여기에 지금까지 내 프로그램입니다. 여기에서 repaint() 메서드 호출을 꺼내십시오.

 else if (evt.getSource() == timer) 
     { 
     drawAnimation(); 
     switchDove(); 
     repaint(); 

이미 비둘기를 전환 했으므로 프로그램이 혼란 스럽습니다. 그게 내 추측이야. 나는 그것을 달렸다. 그리고 그것은 일하는 것처럼 보인다. 건배!

0

나는 또한 당신이 당신의 타이머를 조정하는 방법이 당신에게 아무런 결과도주지 않을 것이라고 눈치 챘다. 다음 명령을 사용해야합니다. timer.setDelay(newDelay); 괄호 안에 인자를 넣을 수도 있습니다. timer.setDelay(DELAY -= 10);

관련 문제