2015-06-21 6 views
0

Так что это мой код:Почему моя анимация не видна?

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

public class Frame { 

Draw d = new Draw(); 

JFrame f1 = new JFrame("Animation 2"); 
JButton bMoveRight = new JButton(">>>>"); 
JButton bMoveLeft = new JButton("<<<<"); 

public Frame() { 

    f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f1.setSize(800, 600); 
    f1.setVisible(true); 
    f1.setResizable(false); 
    f1.setLocationRelativeTo(null); 

    bMoveRight.setBounds(50, 450, 120, 50); 
    bMoveLeft.setBounds(600, 450, 120, 50); 

    f1.add(bMoveRight); 
    f1.add(bMoveLeft); 

    f1.add(d); 

    bMoveRight.addActionListener(new ButtonMoveRight()); 
    bMoveLeft.addActionListener(new ButtonMoveLeft()); 

    } 

    private class ButtonMoveRight implements ActionListener { 
     public void actionPerformed(ActionEvent e){ 
      d.animateRight(); 
     } 
    } 

    private class ButtonMoveLeft implements ActionListener { 
     public void actionPerformed(ActionEvent e){ 
      d.animateLeft(); 
     } 
    } 

} 

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

public class Draw extends JComponent{ 

int x = 50; 

public void paint(Graphics g){ 
    g.setColor(Color.BLACK); 
    g.fillRect(x, 150, 200, 100); 
} 

public void animateLeft(){ 
    try{ 
     while(x != 50){ 
      x--; 
      repaint(); 
      Thread.sleep(10); 
     } 
    } catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

public void animateRight(){ 
    try{ 
     while(x != 550){ 
      x++; 
      repaint(); 
      Thread.sleep(10); 
     } 
    } catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 
} 

Все работает как надо. Кроме одного. Моя анимация происходит, но проблема в том, что она не отображается. Я сделал еще одну программу, где есть только анимация, и она начинается сразу, но в этом я создал кнопки для запуска анимации. Что происходит, я нажимаю кнопку, и ничего не происходит в течение 5 секунд (это время, когда нужно добраться до другой стороны), и через 5 секунд оно появляется на другой стороне окна. Почему моя анимация не появится?

+0

Посмотрите на [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) и [Как использовать Swing Таймеры] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) для получения дополнительной информации – MadProgrammer

ответ

2

Обратный вызов Thread.sleep() внутри ваших обратных вызовов ActionListener сильно обескуражен. Проблема заключается в следующем: ваш код вызывается в том же потоке, который является основным потоком для приложения GUI - он используется для рисования вашего интерфейса.

Что вам нужно сделать вместо вызова sleep() - вы можете запускать некоторые события с задержкой и обрабатывать правильно. Вы должны использовать что-то вроде таймера - возможно, это один https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

Смежные вопросы