Пример 2.3. Приложение KeyCodes.



public class KeyCodes extends JApplet{

int yHeight;              // высота символов шрифта,

Dimension appSize; // текущий размер окна апплета

  public void init()  {

      KeyListener mm = new KeyAdapter() {

          public void keyPressed(KeyEvent e) {

             Graphics g = getGraphics();

             FontMetrics fm = g.getFontMetrics();

             yHeight = fm.getHeight();

String s = "Char - " + e.getKeyChar() + ", Key - " + e.getKeyCode()

+ ", Modifiers - " + e.getModifiers();

             g.drawString(s, 10, yHeight);

          }

           public void keyReleased(KeyEvent e)             {

               Graphics g = getGraphics();

               g.copyArea(0,1,appSize.width-1,appSize.height-yHeight-5,0,yHeight+1);

               g.setColor(Color.YELLOW);

               g.fillRect(1,1,appSize.width-2,yHeight+1);

           }

        };

        addKeyListener(mm);

   }

 

public void paint(Graphics g)  {

   appSize = getSize();

   g.setColor(Color.YELLOW);

   g.fillRect(1,1,appSize.width-1,appSize.height-1);

  }

 

  public static void main(String[] args) {

      JFrame frame = new JFrame ("Пример");

      KeyCodes appl = new KeyCodes();

      appl.init();

      frame.getContentPane().add(appl);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.setSize(800, 300);

      frame.setVisible(true);

  }

 }

 

Таймер

В данном приложении реализуется пример выполнения действия по таймеру. Для реализации таймера в Java существует класс Timer в пакете java.util. Основные методы таймера: scheduleи cancel, которые запускают и останавливают выполнение таймера. Кроме того, для таймера необходимо подготовить задание – класс наследующий от класса TimerTask(класс Updater в примере). В этом классе необходимо переопределить метод public void run(), который вызывается, когда таймер делает свой очередной отсчет.

 

Пример 2. 4. Приложение Timer.

import java.util.Timer;

 

public class MainApplet extends JApplet {

private Timer m_timer = new Timer();

private boolean m_runViaFrame = false;  

private double m_time = 0;

   

private class Updater extends TimerTask {

   private MainApplet m_applet = null;

   // Первый ли запуск метода run()?

   private boolean m_firstRun = true;

   // Время начала

   private long m_startTime = 0;

   // Время последнего обновления

     private long m_lastTime = 0;

       

   public Updater(MainApplet applet)    {

       m_applet = applet;

   }

   @Override

   public void run() {

       if (m_firstRun)  {

           m_startTime = System.currentTimeMillis();

           m_lastTime = m_startTime;

           m_firstRun = false;

       }

       long currentTime = System.currentTimeMillis();

       // Время, прошедшее от начала, в секундах

       double elapsed = (currentTime - m_startTime) / 1000.0;

       // Время, прошедшее с последнего обновления, в секундах

       double frameTime = (m_lastTime - m_startTime) / 1000.0;

       // Вызываем обновление

       m_applet.Update(elapsed, frameTime);

       m_lastTime = currentTime;

   }

}

public MainApplet() { Init(); }

public MainApplet(boolean viaFrame) {

   m_runViaFrame = viaFrame;

      Init();

}

private void Init() {

   // таймер будет вызываться каждые 100 мс

   m_timer.schedule(new Updater(this), 0, 100);

}

public void Update(double elapsedTime, double frameTime) {

   m_time = elapsedTime;

   this.repaint();

}

@Override

public void paint(Graphics g) {

   g.setColor(Color.WHITE);

   g.fillRect(0, 0, this.getWidth(), this.getHeight());

   g.setColor(Color.BLACK);

   String str = "Time = " + Double.toString(m_time);

   g.drawString(str, 15, 15);

}

public static void main(String[] args) {

   JFrame frame = new JFrame("Timer example");

   MainApplet applet = new MainApplet(true);

   frame.add(applet);

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.setSize(800, 600);

   frame.setLocationRelativeTo(null);

   frame.setVisible(true);

}

}

Графика 2D

 

На базе Java реализован пакет Java2D, который позволяет создавать мощную графику. Использование этого пакета возможно только в Java2-приложениях, построенных на основе Java Foundation Classes. Вместо типа Graphics здесь возможно использование типа Graphics2D и всех методов, предоставляемых классом Graphics2D.

Ниже приводен пример апплета двойного назначения, наследующего от Japplet, рисующий окружность с градиентной заливкой.

Пример 2.5. Использование Graphics2D.

import java.awt.geom.Ellipse2D;

 

public class DrawFig extends JApplet {

public void init() { }

public void paint(Graphics g) {

  Graphics2D g2d = (Graphics2D)g;

  GradientPaint gradient =

new GradientPaint(0,0,Color.red,175,175,Color.yellow,true);

  g2d.setPaint(gradient);

   Ellipse2D.Double circle =

new Ellipse2D.Double(10,10,350,350);

  g2d.fill(circle);

  g2d.setPaint(Color.black);

  g2d.draw(circle);

}

public static void main(String[] args) {

  JFrame frame = new JFrame ("Пример");

  DrawFig appl = new DrawFig();

  appl.init();  appl.start();

  frame.getContentPane().add(appl);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.setSize(400, 400);

  frame.setVisible(true);

}

}

Вероятностный подход

 

Вероятность события можно запрограммировать очень просто. Допустим, необходимо определить выполнится ли событие c вероятностью P (от 0.0 до 1.0). Для этого генерируем случайное число (float)Math.random(). Оно как раз будет лежать в диапазоне от 0.0 до 1.0. Если это число меньше либо равно P, то событие исполняется, в противном случае – нет. При такой схеме отдельно нужно учитывать только нижний предел (0.0). Если P = 0.0, то событие не исполняется никогда.

 

Практические задания

 

1. Изучить основные понятия и термины обработки событий по модели делегирования событий на Java.

2. Разобрать приведенные примеры FontsList, LinesDraw, KeyCodes, Timer, DrawFig.

3. Разработать программу. Основная задача – разработка упрощенной имитации поведения объектов (все последующие лабораторные работы будут расширять это задание). Объекты реализуются через наследование: абстрактный класс, интерфейс → наследники.

Рабочий цикл программы:

- запускается процесс симуляции, генерируются объекты классов согласно заданию;

- симуляция завершается, выводится статистическая информация.

Для решения задачи:

- Создать интерфейс IBehaviour, задающий поведение объекта;

- Создать иерархию классов, определяющие объекты по варианту и реализующие интерфейс IBehaviour.

- Создать класс Habitat, определяющий размер рабочей области и хранящий список объектов, с параметрами заданными вариантом. Предусмотреть в классе метод Update, вызывающийся по таймеру и получающий на вход время, прошедшее от начала симуляции. В данном методе должны генерироваться новые объекты и помещаться в поле визуализации в случайном месте. Визуализация объекта – схематично, плюсом будет, если объект будет похож на оригинал;

Рабочее окно программы – область визуализации среды обитания объектов;

4. Симуляция должна запускаться по клавише B и останавливаться по клавише E. При остановке симуляции список уничтожается. Время симуляции должно отображаться текстом в области визуализации и скрываться/показываться по клавише T;

5. По завершению симуляции в поле визуализации должна выводиться информация о количестве и типе сгенерированных объектов, а также время симуляции. Текст должен быть форматирован, т.е. выводиться с использованием разных шрифтов и цветов.

6. Параметры симуляции задаются в классе Habitat.

 

Вариант 1

Объект – муравей. Бывают 2 видов: рабочий и воин. Рабочие рождаются каждые N1 секунд с вероятностью P1. Воины рождаются каждые N2 секунд с вероятностью P2.

Вариант 2

Объект – пчела. Бывают 2 видов: трутень и рабочий. Трутни рождаются каждые N1 секунд, если их количество менее K% от общего числа пчел, в противном случае – не рождаются вовсе. Рабочие рождаются каждые N2 секунд с вероятностью P.

Вариант 3

Объект – аквариумная рыбка. Бывают 2 видов: золотая и гуппи. Золотые рыбки рождаются каждые N1 секунд с вероятностью P1. Гуппи рождаются каждые N2 секунд с вероятностью P2.

Вариант 4

Объект – кролик. Бывают 2 видов: обыкновенный и альбинос. Обыкновенные кролики рождаются каждые N1 секунд с вероятностью P1. Альбиносы рождаются каждые N2 секунд, при условии, что их количество менее K% от общего числа кроликов, в противном случае – не рождаются вовсе.

Вариант 5

Список объектов продажи на автомобильном рынке состоит из 2-х видов машин: грузовые и легковые. Грузовые машины генерируются каждые N1 секунд с вероятностью P1. Легковые генерируются каждые N2 секунд с вероятностью P2.

Вариант 6

Рабочий коллектив компании состоит из разработчиков и менеджеров. Разработчики генерируются каждые N1 секунд с вероятностью P1. Менеджеры генерируются каждые N2 секунд при условии, что их количество менее K% от общего числа разработчиков, в противном случае – не генерируются.

Вариант 7

Список жилых домов города состоит из двух типов: капитальный, деревянный. Капитальные дома генерируются каждые N1 секунд с вероятностью P1. Деревянные дома генерируются каждые N2 секунд с вероятностью P2.

Вариант 8

Список транспортных средств на дороге состоит из двух категорий: автомобили и мотоциклы. Автомобили генерируются каждые N1 секунд с вероятностью P1. Мотоциклы генерируются каждые N2 секунд с вероятностью P2.

Вариант 9

Объект обучающийся. Бывает 2 видов: студент (муж. пола) и студентка (жен. пола). Студенты генерируются каждые N1 секунд с вероятностью P1. Студентки генерируются каждые N2 секунд с вероятностью P2.

Вариант 10

Картотека налоговой инспекции состоит из записей двух типов: физические и юридические лица. Физические лица генерируются каждые N1 секунд с вероятностью P1. Юридические лица генерируются каждые N2 секунд с вероятностью P2.

 

Вопросы для самопроверки

 

1. Что такое апплет двойного назначения?

2. Над объектом какого типа выполняются все графические операции?

3. Почему рекомендуется использовать ограниченный набор цветов?

4. Почему рекомендуется использовать ограниченный набор шрифтов?

5. Как получить список всех доступных шрифтов?

6. Что такое событие? Когда возникают события?

7. Какой метод какого класса получает управление при возникновении события? Что передается ему в качестве параметра?

8. Какие методы отвечают за обработку простых событий от мыши?

9. Какие методы отвечают за обработку простых событий от клавиатуры?

10. Что такое модель делегирования событий?

11. Какие существуют способы задания обработчиков событий?

12. Как подключиться к прослушиванию события?

13. Что такое вложенные классы?

14. Что такое анонимные классы?

15. Как выполнять рисование не в методе paint?

 

 


Дата добавления: 2018-04-15; просмотров: 349; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!