Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите с программой


Автор: СерегаГоляков 26.4.2010, 20:27
Помогите написать прогу, в кот есть один квадрат, вращается и прямолинейно летает в панели или текстфилде, отталкиваясь от стенок)
Как изменять скорость вращения при ударе о стенку сам разберусь.  smile 

Автор: yeputons 26.4.2010, 21:29
Код

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

public class Flying extends JPanel {
  public static void main(String[] args) {
    JFrame fr = new JFrame("Flying square");
    fr.add(new Flying());
    fr.pack(); // Для подгона размеров
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fr.setVisible(true);
  }

  Timer tmr;
  final int w = 32, h = 16;
  int x, y, vx, vy;

  public Flying() {
    setPreferredSize(new Dimension(320, 240));
    setSize(getPreferredSize());
    x = y = 0; vx = 3; vy = 2;

    tmr = new Timer(25, new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        x += vx; y += vy;

        if (((x < 0) && (vx < 0)) ||
            ((x + w >= getWidth()) && (vx > 0))) { vx = -vx; x += vx; }
        if (((y < 0) && (vy < 0)) ||
            ((y + h >= getHeight()) && (vy > 0))) { vy = -vy; y += vy; }
        repaint();
      }
    });
    tmr.start();
  }

  public void paint(Graphics _g) {
    super.paint(_g);
    Graphics2D g = (Graphics2D)_g;

    g.setColor(Color.BLACK);
    g.drawRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLUE);
    g.drawRect(x, y, w, h);
  }
}

Автор: СерегаГоляков 26.4.2010, 21:49
ОО вапче крутотень) ОГРОМНОЕ СПАСИБО!!!!  smile  smile 
А чиво значит:
Timer tmr;
 tmr = new Timer(25, new ActionListener() {...}
1) Это есть то как часто поток движения будет запускаться?! Типо вместо засыпания?

Еще вопросик,
2)Вот у мя есть другой класс:  РаботаетView extends FrameView{}
в кот есть JPanel1, и в кот я еще нарисовал кружок летающий.
Хочу в эту же JPanel1 прорисовывать этот квадрат. 
Где здесь что-что изменить чтоб рисовало именно в моем JPanel1 ??

Автор: yeputons 26.4.2010, 22:20
1)Создаём таймер - это невидимый компонент, который с заданной частотой (указывается в конструкторе в миллисекундах) бросает событие ActionEvent. Это сделано во избежание цикла с засыпанием. Я считаю таймеры лучшим решением, поскольку это системный компонент и система точно будет обрабатывать разные событие. При цикле с засыпанием неизвестно, что делает система в оставшийся период времени. Да и просто - для чего-то же таймеры создавались.

2)просто перенеси процедуру paint(Graphics _g) в свой JPanel1. или допиши в конец существующей, если такая есть.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)