Gọi repaint() nhiều lần trong JFrame và JApplet
Khi học Java, chúng ta thường bắt gặp những chương trình đơn giản về animation trong các sách dạy AWT và Swing, chẳng hạn như chương trình sau đây:
import java.awt.*; import javax.swing.*; public class Animation1 { public static void main( String[] args ) { Animation1 gui = new Animation1(); gui.go(); } private void go() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); panel_ = new MyPanel(); frame.getContentPane().add( panel_, BorderLayout.CENTER ); frame.setSize( 500, 500 ); frame.setVisible( true ); for( int i = 0; i < 400; i++ ) { x_++; y_++; panel_.repaint(); try { Thread.sleep( 10 ); } catch( Exception ex ) { } } } class MyPanel extends JPanel { public void paintComponent( Graphics g ) { g.setColor( Color.white ); g.fillRect( 0, 0, this.getWidth(), this.getHeight() ); g.setColor( Color.green ); g.fillOval( x_, y_, 40, 40 ); } } private JPanel panel_; private int x_ = 0; private int y_ = 0; }
Chương trình này vẽ ra một vòng tròn trên một panel, tính toán lại tọa độ của nó rồi gọi repaint() để vẽ lại vòng tròn. Phương thức repaint() yêu cầu các component trên frame tự vẽ lại.Thao tác vẽ lại liên tục với các vị trí khác nhau sẽ tạo ra cảm giác vòng tròn chạy trên panel. Câu lệnh Thread.sleep(10) làm giảm tốc độ di chuyển của vòng tròn giúp người dùng dễ theo dõi.
Chúng ta thử sáng tạo thêm một chút bằng cách thêm vào frame một button dùng kể kích hoạt animation (học event handler và inner class luôn). Animation sẽ được kích hoạt khi người dùng ấn nút “Start animation”. Chương trình được cải tiến như sau: (more…)