2015-08-26 5 views
0

Я только начал изучать GUI и Swing и решил написать программу, которую я нашел в учебнике, чтобы отобразить цветной прямоугольник и сделать его похожим на уменьшение размера на экране.Проблема с базовой анимацией Java Swing

Ниже приведен код, который я написал, моя проблема заключается в том, что прямоугольник отображается на экране, но не перерисовывается на меньший размер каждые 50 мс. Может ли кто-нибудь указать, где я ошибаюсь?

Большое спасибо

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

public class Animate { 

int x = 1; 
int y = 1; 

public static void main(String[] args){ 

    Animate gui = new Animate(); 
    gui.start(); 

} 

public void start(){ 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Rectangles rectangles = new Rectangles(); 

    frame.getContentPane().add(rectangles); 
    frame.setSize(500,270); 
    frame.setVisible(true); 

    for(int i = 0; i < 100; i++,y++,x++){ 

     x++; 
     rectangles.repaint(); 

     try { 
      Thread.sleep(50); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

    } 

} 





class Rectangles extends JPanel { 

public void paintComponent(Graphics g){ 
    g.setColor(Color.blue); 
    g.fillRect(x, y, 500-x*2, 250-y*2); 
} 

} 
} 
+0

Проводили ли вы базовую отладку? Вы добавили инструкцию в свой метод рисования, чтобы узнать, вызвана ли она? Вы отображали значения x/y? – camickr

ответ

2

Прямоугольник показывает на экран, но не перекрашивается на меньший размер каждые 50 мс.

При выполнении обычной покраски основной код должен быть:

protected void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); // to clear the background 

    // add custom painting code 
} 

Если вы не очистили фон, то осталась прежняя картина. Так что рисовать что-то меньшее не будет иметь никакого значения.

Для лучшей структуры вашего кода переменные x/y должны быть определены в классе Rectangles. Затем вы должны создать такой метод, как decreaseSize(), который также определен в вашем классе Rectangles. Этот код обновит значения x/y, а затем вызовет перерисовку. Таким образом, ваш код анимации просто вызовет метод decreaseSize().

+0

Это имеет смысл теперь, спасибо. Я попробую создать предложенный метод – user3650602

0
  1. Вы должны перекрасить весь JFrame вместо (или JPanel ваши графики на).
  2. Вы не должны вызывать x++ дважды, вместо того, чтобы сделать x+=2

Изменить код этого (работ, я также установил отступы):

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

public class Animate { 

    int x = 1; 
    int y = 1; 

    public static void main(String[] args) { 

     Animate gui = new Animate(); 
     gui.start(); 

    } 

    public void start() { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Rectangles rectangles = new Rectangles(); 

     frame.getContentPane().add(rectangles); 
     frame.setSize(500, 270); 
     frame.setVisible(true); 

     for (int i = 0; i < 100; i++, y++, x += 2) { 
      frame.repaint(); 

      try { 
       Thread.sleep(50); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 

    } 

    class Rectangles extends JPanel { 

     public void paintComponent(Graphics g) { 
      g.setColor(Color.blue); 
      g.fillRect(x, y, 500 - x * 2, 250 - y * 2); 
     } 

    } 
} 
+0

1) Нет причин перерисовывать весь кадр. Если изменяется только панель, то просто перерисуйте панель. 2) Хороший совет, но опубликованный код не выполняется на EDT. Код, выполняемый из основного метода, вызывается в нормальном потоке UNLESS, код заверяется в 'SwingUtilities.invokeLater (...)'. – camickr

+0

@camickr Он не создал JPanel, он добавил все в контентную панель JFrame. (но спасибо за указание, что мое утверждение неверно (то же самое для пункта 2)). –