Урок 2. Пишем игру на JAVA.

отрисовка окна JFrame

Часть 2.Компонет JFrame. Создаем анимацию.

В прошлой части мы научились отрисовывать главное окно программы. Теперь мы потренируемся создавать анимацию в этом окне. И добавим еще один компонент JPanel и научимся им пользоватся.

При построении интерфейсов нужны компоненты-контерйнеры, которые будут содержать другие компоненты пользовательского интерфейса. В Swing одним из таких компонентов-контейнеров является JPanel. По умолчанию JPanel сама по себе ничего не отрисовывает за исключением фона. При работе с контейнерами, разработчику надо решить, как правило, две основные проблемы. Первая – задать расположение дочерних компонентов и вторая – осуществить добавление компонентов на контейнер.

Код программы

// Java core packages
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

// Java extension packages
import javax.swing.*;

public class ArtAnimator extends JPanel implements ActionListener, Serializable {
protected ImageIcon images[];
protected int totalImages = 50, currentImage;
protected Timer animationTimer;
// load images and start animation
public ArtAnimator() {
images = new ImageIcon[ totalImages ];
URL url;
// load animation frames
for ( int i = 0; i < images.length; ++i ) {
url = ArtAnimator.class.getResource("images/" + i + ".gif" );
images[ i ] = new ImageIcon( url );
}
}

// render one frame of the animation
public void paintComponent( Graphics g ) {
super.paintComponent( g );
// draw current animation frame
images[ currentImage ].paintIcon( this, g, 0, 0 );
currentImage = ( currentImage + 1 ) % totalImages;
}

// start Timer that drives animation
public void startAnimation() {

// if animationTimer is null, restart animation
if ( animationTimer == null ) {
currentImage = 0;
animationTimer = new Timer( 300, this );
animationTimer.start();
} else // continue from last image displayed
if ( !animationTimer.isRunning() )
animationTimer.restart();
}

// repaint when Timer event occurs
public void actionPerformed( ActionEvent actionEvent ) {
repaint();
}

// stop Timer that drives animation
public void stopAnimation() {
animationTimer.stop();
}

// get animation preferred width and height
public Dimension getPreferredSize() {
return new Dimension( 600, 340 );
}

// get animation minimum width and height
public Dimension getMinimumSize() {
return getPreferredSize();
}

// execute bean as standalone application
public static void main( String args[] ) {
// create new ArtAnimator
ArtAnimator animation = new ArtAnimator();

// create new JFrame with title "Animation test"
JFrame application = new JFrame( "Strip Dance" );
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

// add LogoAnimator to JFrame
application.add(animation);

// set the window visible
application.pack();
application.setVisible( true );

animation.startAnimation();
}

} // end class ArtAnimator

Начинается выполнение с метода main(). Создаем объект класса ArtAnimator, вызвав его конструктор.

В конструкторе класса ArtAnimator производим инициализацию переменной images[] которая является массивом объктов типа ImageIcon. В цикле мы вычитываем каждую картинку и кладем в массив. Имя файла мы составляем динамически, конкатенируя строки.

Дальше создаем окно нашей программы с помощью класса JFrame библиотеки Swing. Задаем название и метод закрытия окна. Добавляем компонент JPanel в JFrame.

Вызываем метод startAnimation() нашего объкта ArtAnimator, в этом методе инициализируется таймер, если он до этого не был создан, и ему передается ссылка на наш объект ArtAnimator, через эту ссылку таймер будет вызывать метод actionPerformed() и выполнять перерисовку экрана, через интервалы времени, в нашем случае 300 мс. В методе paintComponent() и происходит выбор следующей картинки и его отрисовка в компоненте.

Результат

Анимация в окне JFrame

Структура проекта чтобы правильно были найдены файлы картинок. Архив. Картинки из архива положить в папку images.

Структура проекта

Источник(видео).