понедельник, 14 июня 2010 г.

Java проблемы новичка. Часть 2

Итак, вот ещё набор заметок о том, как использовать Java

Рандом

Иногда возникает задача внести элемент случайности в программу.
Для получения случайного числа в Java можно использовать псевдогенератор случайных чисел. Для этого нужно создать класс Random(), определённый в java.util.Random.

Random r = new Random(); // создание нового класса случайных чисел
int ind = r.nextInt(5); // генерация случайного числа, с ограничением верхнего числа = 5

Рисование на форме

Мне потребовалось прорисовывать на форме траекторию движения. Сделано это с помощью класса Graphics.

Давайте рассмотрим пример. Для начала поговорим о входных параметрах.
Первый параметр это Graphics т.е. класс который можно получить у формы, на которой будет выполняться отрисовка, с помощью метода JPanel.getGraphics()

Второй параметр это пользовательский класс который содержит в себе набор контрольных точек "координат".
Итак давайте разберем функцию

private void PaintTrac(Graphics gr, EyesSet sets){
  Graphics2D g = (Graphics2D)gr; // выполняется приведение класса Graphics к Graphics2D который стал доступен в Java 1.2
  //Graphics2D является расширением Graphics.

  int timeLine = (pr.practicePeriod/4)/sets.GetPointsCount(); // здесь рассчитываем время отводимое для перерисовки от точки х1 до точки х2, из расчёта, что вся фигура должна повториться 4 раза за отведенный период
  Property last = null; // пользовательский класс последней прорисованной координаты
  for (int it = 0; it < 4; it++){ // начало цикла одной прорисовки
    for (Iterator iter = sets.GetPoints().iterator(); iter.hasNext();){ //для всех координат в наборе
      if (last == null) { // если зашли в цикл первый раз
         last = iter.next(); // то последний прорисованной координатой будет 1ая
      } else { // если до этого уже что то нарисованно
         Property now = iter.next(); // получаем текущую координату
         int step = Math.max(Math.round(Math.abs(last.getXCoord() - now.getXCoord())),
                             Math.round(Math.abs(last.getYCoord() - now.getYCoord()))); // определяем максимальный сдвиг по х координате или по у.
         for (int i = 0; i < step; i++){ // начало прорисовки движения
           g.setColor(Color.black); // устанавливаем цвет фона
           g.fillRect(0, 0, fr.getWidth(), fr.getHeight()); // заполняем фоном всю доступную область
           float x = ((float)(now.getXCoord() - last.getXCoord())/step)*(i+1); // вычисляем дельту смещения по оси х
           float y = ((float)(now.getYCoord() - last.getYCoord())/step)*(i+1); // вычисляем дельту смещения по оси у
           g.setColor(Color.red); //устанавливается новый цвет которым будет выполняться прорисовка
           g.fillOval(last.getXCoord() + Math.round(x), last.getYCoord() + Math.round(y), 25, 25); // рисуется простая фигура
           try {//останавливаем выполнение программы на время задержки
             Thread.sleep(timeLine/step);
           } catch (InterruptedException e) {
             e.printStackTrace();
           }
        }
        last = now;
      }// конец прорисовки одной линии траектории
    }// конец полного цикла прорисовки фигуры
  }// конец одного цикла прорисовки всей фигуры
}

3 Выделение цветом выбранной записи в JList

Иногда требуется подсветить конкретную запись в списке, чтобы отобразить какой именно элемент выбран. Для того чтобы выделить цветом выбранную запись нужно переопределить функцию setCellRenderer. Делается это вот так:
JList.setCellRenderer(new javax.swing.DefaultListCellRenderer(){
          public Component getListCellRendererComponent(JList list, 
                                   Object value,
                                   int index, boolean isSelected,
                                   boolean cellHasFocus) {
   // выбранное значение приводим к типу который хранится в списке связанным с данным листом
   Property prop = (Property)value;
   // изменяем способ отображения информации, вместо указателя на объект будет отображаться требуемый текст
   setText(prop.getDisplayCoordinat());

   // определяем набор цветов
   // переменные для определения цвета
   int front = 1;
   int back = 0;
   // по умолчанию чёрные буквы белый фон
   Color[] bfg = {Color.WHITE, Color.BLACK};
   //если ячейка выбрана
   if (isSelected) {
     //голубой фон
     bfg[back] = Color.CYAN;
     //черные буквы
     bfg[front] = Color.BLACK;
   }
   // меняем цвета
   setBackground(bfg[back]);
   setForeground(bfg[front]);
return this;
}
});

4 Коллекции

Довольно часто требуется работа с коллекциями. Это большая тема о которой можно почитать вот здесь

5 События на кнопки мыши

Иногда случается так, что нужно добавить событие при нажатии определённой кнопки мыши. Делается это очень просто. Для требуемого визуального объекта вызываем свойство addMouseListener, и переопределяем MouseAdapter(). Для того, что бы обработать определённую кнопку можно воспользоваться условием, evt.getButton() == MouseEvent.BUTTON3 Ниже приведу свой пример:
jlSet.addMouseListener(new java.awt.event.MouseAdapter() {
             // обрабатываем событие при нажатии кнопки мыши
             public void mouseClicked(java.awt.event.MouseEvent evt) {
             // дальше выполняется обработка только если нажата правая кнопка мыши
             if (evt.getButton() == MouseEvent.BUTTON3){
               ...
             };   
});
Вот пока и всё что накопилось. Здесь можно почитать Часть 1

Комментариев нет:

Отправить комментарий