Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание простой анимации 
:(
    Опции темы
moisye
Дата 1.6.2012, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Добрый день.
Задача следующая:
Нужно создать графический редактор, в котором имелась бы возможно рисования мышью. При этом по нажатию некоторой клавиши окружность с радиусом R пробегает по нарисованной кривой.
Начал делать, но не получается реализовать анимация, которая бы запускалась по нажатию клавиши. А именно не корректно работает функция keyPressed(т.е вместо того, чтобы нарисовать точку, потом "поспать" некоторое время, программа работает след образом: сначала спит "некоторое время" умноженное на количество точек, а потом рисует все получившиеся точки в одно мгновение.)
В чем может быть ошибка?
Код

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.awt.event.KeyListener.*;
 class Edge {
   public int a, b;
   public Edge( int A, int B ) {
      a = A;  b = B;
   }
}
public class GraphApplet extends Applet
   implements KeyListener, MouseMotionListener {
    int kp;
   int width, height;
   int count=0;
   Image backbuffer;
   Graphics backg;
    Edge[] edges;
   public void init() {
      width = getSize().width;
      height = getSize().height;
      addKeyListener( this );
      addMouseMotionListener( this );      
      backbuffer = createImage( width, height );
      backg = backbuffer.getGraphics();
      backg.setColor( Color.white );
      backg.fillRect( 0, 0, width, height );
      backg.setColor( Color.orange );
      
   }
  public void keyPressed (KeyEvent evt) {
     kp =  evt.getKeyChar();
     backg.setColor( Color.red );
        for(int i = 0; i < 100; i = i + 1)
        {
         try {  Thread.sleep(20); }
         catch(InterruptedException e) { }
        backg.fillOval(10+i*10,10+i*10,10,10);        
        repaint();
        }        
   }
// a?oaea iaoiau eioa?oaena KeyListener
    public void keyReleased (KeyEvent evt) {}
    public void keyTyped(KeyEvent evt) {}
   public void mouseMoved( MouseEvent e ) { }
   public void mouseDragged( MouseEvent e ) {
        edges = new Edge[ 500 ];        
      int x = e.getX();
      int y = e.getY();
      if(count < 500)
      {
        edges[ count] = new Edge( x, y );
        count++;
        backg.fillOval(x-5,y-5,10,10);
        repaint();
        e.consume();
      }
   }
 
   public void update( Graphics g ) {
      g.drawImage( backbuffer, 0, 0, this );
   }
 
   public void paint( Graphics g ) {
      update( g );
   }
}


Пожалуйста откликнитесь!
PM MAIL   Вверх
dorogoyIV
Дата 2.6.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



блин, ну и тему ты себе выбрал...
в апплетах тяжеловесные компоненты, и работать с ними тяжело!
вот примерно накидал... (можно дорабатывать, но, чем дальше в лес, тем больше дров! ;) )

правила пользования:
1. водим нажатой мышой по полю
2. кликаем мышой по полю
3. жмем клаву
если вдруг не сработало,
мышой по полю повозим... ;) , или репэйнт сделаем принудительно - сворачиваем/разворачиваем окно браузера.

Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Main extends JApplet
                  implements KeyListener,
                             MouseListener,
                             MouseMotionListener
{
 Point start;
 ArrayList <Point> points = new ArrayList <Point> ();
 Graphics gr;

 Circle circle;
 Rect rect;

 public void init()
 {
  setLayout(null);
  addKeyListener(this);
  addMouseListener(this);
  addMouseMotionListener(this);
 }

 public void keyPressed(KeyEvent e)
 {
  anim();
 }
 public void keyReleased(KeyEvent e){}
 public void keyTyped(KeyEvent e){}

 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}
 public void mousePressed(MouseEvent e){}
 public void mouseReleased(MouseEvent e){}
 public void mouseClicked(MouseEvent e)
 {
  rect = new Rect(40, 6, Color.BLUE);
  rect.setBounds(100, 100,
                 rect.getRadius() * 2,
                 rect.getRadius() * 2);

  circle = new Circle(30, 3, Color.RED);
  circle.setBounds(-circle.getRadius() * 2,
                   -circle.getRadius() * 2,
                    circle.getRadius() * 2,
                    circle.getRadius() * 2);
  add(circle);
  add(rect);
  validate();
  repaint();
 }

 public void mouseMoved(MouseEvent e)
 {
  start = e.getPoint();
 }
 public void mouseDragged(MouseEvent e)
 {
  Point p = e.getPoint();
  points.add(p);
  gr.setColor(Color.GREEN);
  gr.drawLine(start.x, start.y, p.x, p.y);
  start = p;
  repaint();
 }

 private void anim()
 {
  new Thread(new Runnable()
  {
   public void run()
   {
    int i = 1, j = points.size();
    int r = circle.getRadius();

    while(points.get(i) != null)
    {
     try
     {
      Thread.currentThread().sleep(50);
      Point p = points.get(i);
      Point p2 = points.get(j);

      circle.setLocation(p.x - r, p.y - r);
      rect.setLocation(p2.x - r, p2.y - r);
      i++;
      j--;
     }
     catch(Exception ex){}
    }
   }
  }).start();
 }
}

class Figure extends JComponent
{
 int radius;
 int stroke;
 Color color;

 Figure(int radius, int stroke, Color color)
 {
  this.radius = radius;
  this.stroke = stroke;
  this.color = color;
 }

 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D)g;
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                      RenderingHints.VALUE_ANTIALIAS_ON);
  g2.setStroke(new BasicStroke(stroke));
  g2.setColor(color);
 }

 public int getRadius()
 {
  return radius;
 }
}

class Circle extends Figure
{
 Circle(int radius, int stroke, Color color)
 {
  super(radius, stroke, color);
 }

 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D)g;
  super.paintComponent(g2);
  int c = stroke / 2 + 1;
  g2.drawOval(c, c, radius * 2 - c * 2, radius * 2 - c * 2);
 }
}

class Rect extends Figure
{
 Rect(int radius, int stroke, Color color)
 {
  super(radius, stroke, color);
 }

 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D)g;
  super.paintComponent(g2);
  int c = stroke / 2 + 1;
  g2.drawRect(c, c, radius * 2 - c * 2, radius * 2 - c * 2);
 }
}


Код

<html>
    <head>
        <title>Figueres</title>
    </head>
    <body>
        <applet code="Main" width="500" height="600"></applet>
    </body>
</html>



Это сообщение отредактировал(а) dorogoyIV - 2.6.2012, 18:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1063 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.