2009-12-16 7 views
1

Java에서 일련의 이미지에 애니메이션을 적용하고 있습니다. 지금까지 아무 문제없이 움직일 수있었습니다. 이 문제는 컨트롤 (시작, 중지 등)에 추가 할 때만 발생합니다. 내 GUI에서 시작을 누르면 GUI가 애니메이션을 표시하지 않고 애니메이션이 끝난 후 마지막 프레임 만 표시됩니다.일련의 이미지에 애니메이션 적용

몇 가지 방법을 시도했지만 그 중 아무 것도 작동하지 않아서 스레딩 문제 또는 페인팅 문제인지 확실하지 않습니다.

public class SwingAnimation extends JPanel implements ActionListener {

protected JFrame frame; 
protected JLabel lblDisplay; 
protected JButton BtnStart, BtnStop, BtnPause; 
protected JCheckBox chkLoop; 
protected Thread th; 

public static void main(String[] args) { 
    SwingAnimation sa = new SwingAnimation(); 
} 

public SwingAnimation() { 
    frame = new JFrame("Animation"); 
    Panel panel = new Panel(); 

    lblDisplay = new JLabel(); 
    BtnStart = new JButton("Start"); 
    BtnStop = new JButton("Stop"); 
    BtnPause = new JButton("Pause"); 
    chkLoop = new JCheckBox("Loop"); 

    BtnStop.setEnabled(false); 
    BtnPause.setEnabled(false); 

    BtnStart.setActionCommand("start"); 
    BtnStop.setActionCommand("stop"); 
    BtnPause.setActionCommand("pause"); 

    panel.add(lblDisplay); 
    panel.add(BtnStart); 
    panel.add(BtnPause); 
    panel.add(BtnStop); 
    panel.add(chkLoop); 
    frame.add(panel, BorderLayout.CENTER); 
    frame.setSize(400, 400); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //set the frame in the center of the screen 
    Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); 
    int screen_x = (screensize.width - frame.getWidth())/2; 
    int screen_y = (screensize.height - frame.getHeight())/2; 
    frame.setLocation(screen_x, screen_y); 

    BtnStart.addActionListener(this); 
    BtnStop.addActionListener(this); 
    BtnPause.addActionListener(this); 
    chkLoop.addActionListener(this); 
    th = new Thread(); 
    //ImageAnimator(); 
} 

public void ImageAnimator() { 
    try { 
     for (int i = 0; i <= 299; i++) { 
      ImageIcon images = new ImageIcon("C:\\Users\\Desktop\\Images\\Snap" + i + ".jpg"); 
      lblDisplay.setIcon(images); 
      th.sleep(25); 
     } 
    } catch (InterruptedException e) { 
    } 
} 

public void actionPerformed(ActionEvent e) { 
    if ("start".equals(e.getActionCommand())) { 
     BtnStart.setEnabled(false); 
     BtnStop.setEnabled(true); 
     BtnPause.setEnabled(true); 
     lblDisplay.setVisible(true); 
     ImageAnimator(); 
    } else if ("stop".equals(e.getActionCommand())) { 
     BtnStart.setText("Start"); 
     BtnStart.setEnabled(true); 
     BtnStop.setEnabled(false); 
     BtnPause.setEnabled(false); 
     lblDisplay.setVisible(false); 
     th = null; 
    } else if ("pause".equals(e.getActionCommand())) { 
     BtnStart.setText("Resume"); 
     BtnStart.setEnabled(true); 
     BtnStop.setEnabled(true); 
     BtnPause.setEnabled(false); 
    } 
} 

}

+0

문제가 아니지만 'th'에 저장된 스레드를 만들 필요가 없습니다. 'sleep' 메서드는 정적이며'Thread.sleep (25)'로 호출되어야합니다. –

답변

3

빠른 수정 :이 같은

변경 ImageAnimator은() :

 lblDisplay.setIcon(images); 
     lblDisplay.paintImmediately(getBounds()); 
     th.sleep(25); 

당신이 발생하는 문제는 설정이다

다음

내 코드입니다 아이콘이 자동으로 Swing으로 하여금 화면 상에 컴포넌트를 다시 칠하게하지는 않습니다. paintImmediately를 부르는 것은 그것을 할 것입니다.

일반 정보 : 스윙

애니메이션은 일반적으로 Swing Timer를 사용하여 수행됩니다. UI가 응답하지 않는 순간을 알 수 있습니다. 일단 애니메이션을 시작하면 끝날 때까지 멈출 수 없습니다. 모든 스윙 이벤트는 단일 스레드 인 Event Dispatch Thread에서 발생하기 때문입니다. 중간에 Thread.sleep (...)을 사용하여 루프를 실행하면이 스레드가 연결되어 다른 입력 (예 : 중지 버튼을 누르는 것)을 처리 할 수 ​​없습니다.

This article 어떻게하면 이해할 수 있었을까요? 스윙은 동시성을 처리하고, The Swing Trail은 스윙을 효과적으로 사용하고, 맞춤 구성 요소를 페인팅하는 데 대한 많은 조언을 가지고 있습니다.

Filthy Rich Clients에 데모 코드를 연결하고 싶습니다. .

+0

및 메서드 이름은 소문자로 시작해야하므로 imageAnimator() ... :) – willcodejavaforfood

+0

전화. 저는 C++ 전문가 몇 명과 함께 일하며, 대문자 사용법에 익숙한 방식으로 익숙해졌으며 등록도하지 않았습니다. : – MHarris

+0

조언을 주셔서 감사합니다. 그러나 paintImmediately() 메소드는 심볼을 찾을 수 없다는 사실을 계속해서 알려주지 않으므로 작동하지 않습니다. 그러나 스윙 타이머로 전환 할 것입니다. –

1

Java 2D games tutorial은 몇 가지 기본 애니메이션 기술을 다룹니다. 기술을 설명하는 몇 가지 관련 예제는 here이며이 완료 example은 중지 및 시작 버튼을 보여줍니다.

관련 문제