Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Генерирование изображения с использованием цикла



 

До этого мы в панели MyPanel выводили изображение с заранее просчитанными координатами элементов. Можно сказать, что то изображение было статичным. Сейчас мы создадим панель MyPanel2, в которой будем формировать изображение динамически – во время работы программы. Сейчас мы разберем, как нарисовать такое изображение:

 

 

Рис. 2.25. Генерируемый рисунок

 

 

Создадим класс MyPanel2, расширяющий JPanel:

 

 

Рис. 2.26. Создание класса панели MyPanel2

 

Добавим в сгенерированный код класса MyPanel2 метод paint() с кодом рисования красной линии:

 

import javax.swing.JPanel;

import java.awt.Graphics;

 

public class MyPanel2 extends JPanel {

@Override

public void paint(Graphics g) {

// отрисовываем элементы наследуемые от JPanel

     super . paint ( g );

// Цвет рисования - красный

     g . setColor ( Color . red );

// рисуем линию от точки (10,50) до точки (200,50)

     g . drawLine (10, 50, 200, 50);

}

}

 

Теперь перейдем в код класса Home и изменим в методе initialize() строку создания панели с

     JPanel panel = new MyPanel();

на

     JPanel panel = new MyPanel2();

 

После этого изменения код initialize() будет выглядеть так:

 

/**

 * Initialize the contents of the frame.

 */

private void initialize() {

     frame = new JFrame();

     frame.setBounds(100, 100, 477, 604);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     frame.getContentPane().setLayout(null);

         

     // Здесь создается наша панель MyPanel2 с линией

     JPanel panel = new MyPanel2();

     panel.setBorder(new BevelBorder(BevelBorder.LOWERED,

          null, null, null, null));

     panel.setBounds(10, 11, 432, 534);

     frame.getContentPane().add(panel);

}

 

Запустим класс Home на выполнение. Увидим такой рисунок на экране:

 

 

Рис. 2.27. Работа приложения Home с панелью MyPanel2

 

Вернемся в класс MyPanel2. Изменим метод paint() таким образом, чтобы наша линия от точки (10,50) до точки (200,50) рисовалась по-другому. А именно, координаты точки 1 (10,50) и точки 2 (200,50) зададим с использованием переменных:

 

public void paint(Graphics g) {

     super.paint(g);

     g.setColor(Color.red);

     // координаты первой точки ( x 1, y 1)  

     int x 1 = 10;

     int y 1 = 50;

     // координаты второй точки ( x 2, y 2)

     int x 2 = 200;

     int y 2 = 50;

     // Рисуем линию между точками ( x 1, y 1) и ( x 2, y 2)

     // Фактически рисуется линия между

     // точками (10, 50) и (200, 50)

     g.drawLine(x1, y1, x2, y2);

//   g.drawLine(10, 50, 200, 50);

}

 

Сохраним изменения в коде. Запустим на выполнение Home и увидим то же изображение, что и на рис.2.27.

Теперь добавим в код цикл while, внутри которого будем изменять значение переменной y2. При каждом выполнении тела цикла y2 будет увеличиваться на 10. В итоге при каждом выполнении тела цикла точка 2 будет смещаться вниз на 10. Посмотрите код, который получился после добавления while:

 

public void paint(Graphics g) {

     super.paint(g);

     g.setColor(Color.red);

     // Задаем начальные координаты точки 1

     int x1 = 10;

     int y1 = 50;

     // Задаем начальные координаты точки 2        

int x2 = 200;

     int y2 = 50;

 

     // линия будет рисоваться до тех пор, пока

     // вторая точки не опустится до y 2 >= 150

     while (y2 < 150) {

           g.drawLine(x1, y1, x2, y2);

           // значение y 2 увеличивается

           // на 10 каждую итерацию

           // в итоге точка 2 опускается       

           y 2 = y 2 + 10;

     }

}

 

 

Запустим класс Home на выполнение сейчас. Вы увидите несколько линий, которые все начинаются в точке 1 с координатами (10,50), но заканчиваются в разных точках 2:

 

 

Рис. 2.28. Рисуются линии с общей точкой 1, но с разными точками 2

 

Добавим в цикл while также изменение координаты y1. Будем уменьшать y1 при каждом выполнении тела цикла на 5. В итоге точка 1 будет подниматься на 5 пикселей при каждом выполнении цикла. Код после изменения будет выглядеть так:

 

public void paint(Graphics g) {

     super.paint(g);

     g.setColor(Color.red);

     // Задаем начальные координаты точки 1

     int x1 = 10;

     int y1 = 50;

     // Задаем начальные координаты точки 2        

     int x2 = 200;

     int y2 = 50;

 

     // линия будет рисоваться до тех пор, пока

     // вторая точки не опустится до y2 >= 150

     while (y2 < 150) {

           g.drawLine(x1, y1, x2, y2);

           // значение y2 увеличивается

           // на 10 каждую итерацию

           // в итоге точка 2 опускается            

           y2 = y2 + 10;

               

           // значение y 1 уменьшается

           // на 5 каждую итерацию

           // в итоге точка 1 поднимается      

           y 1 = y 1 - 5;

     }

}

 

Запустим класс Home на выполнение сейчас. Вы увидите несколько линий, которые все начинаются в разных точках 1, и заканчиваются в разных точках 2:

 

 

Рис. 2.29. Рисуется узор за счет перемещения точки 1 вверх и одновременное перемещение точки 2 вниз

 

Полный код программы будет выглядеть так:

 

import javax.swing.JPanel;

import javax.swing.JPanel;

import java.awt.Color;

import java.awt.Graphics;

 

public class MyPanel2 extends JPanel {

@Override

public void paint(Graphics g) {

     super.paint(g);

     g.setColor(Color.red);

 

     int x1 = 10;

     int y1 = 50;

     int x2 = 200;

     int y2 = 50;

     while (y2 < 150) {

           g.drawLine(x1, y1, x2, y2);   

           y2 = y2 + 10;

     y1 = y1 - 5;

     }

}

}


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 335; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.033 с.)
Главная | Случайная страница | Обратная связь