немного переписал программу. возникла необходимость в понятном объяснении ее работы и комментировании. особенно пояснение по потокам...с ними у меня большие проблемы( и если не трудно, то и по Афинным преобразованиям...именно на примере моей программы... Main.java | Код | import java.awt.event.*; import java.util.*;
import javax.swing.JComponent; import javax.swing.JFrame;
public class Main extends JComponent implements Runnable { private class MouseClick extends MouseAdapter { @Override public void mousePressed(MouseEvent evt) { if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { System.out.println("left " + (evt.getPoint())); } if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) { System.out.println(("STARS count: ") + squares.size()); addItem(f,speed,evt.getPoint().x,evt.getPoint().y,color); } if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) { System.out.println("right " + (evt.getPoint())); } } } private static final long serialVersionUID = 1L; public ArrayList<Square> squares; public Thread t; MouseClick mouse_control;
class WheelEvent implements MouseWheelListener { @Override public void mouseWheelMoved(MouseWheelEvent evt) { if (evt.getScrollType()==MouseWheelEvent.WHEEL_UNIT_SCROLL); if (-1 == evt.getWheelRotation()) { speed--; for (int i = 0; i < squares.size(); i++) { squares.get(i).angle = speed; } } else speed++; for (int i = 0; i < squares.size(); i++) { squares.get(i).angle = speed; } } } public static int color; public static int speed; WheelEvent mousewheel_control; Main() { t = new Thread(this);//создаем поток System.out.println("поток создан"); t.start(); //запускаем System.out.println("поток запущен"); mouse_control = new MouseClick(); mousewheel_control = new WheelEvent(); addMouseListener(mouse_control); addMouseWheelListener(mousewheel_control); } public void addItem(JFrame frame, int d, int width, int height, int color) { Square sq = new Square(d,width, height); sq.setBounds(0, 0, 1024, 1000); this.squares.add(sq); frame.add(sq); } public void run() { try { while(true) { Thread.currentThread(); Thread.sleep(100); for (int i = 0; i < squares.size(); i++) { squares.get(i).rotateRect(); squares.get(i).repaint(); } } } catch(Exception ex){} } public static JFrame f=new JFrame("STARS"); public static void main(String [] args) { Main m = new Main(); m.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.BLACK)); m.setSize(new java.awt.Dimension(600, 600)); f.setLayout(null); m.squares = new ArrayList<Square>(); f.add(m); f.setSize(400, 400); f.setResizable(false); f.setVisible(true); f.getContentPane().add(m); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
|
Squares.java | Код | import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.*; import javax.swing.JComponent;
public class Square extends JComponent // наследуем класс от Jcomponent { private static final long serialVersionUID = -8618517245604973460L; AffineTransform at = new AffineTransform(); int angle=0; int width=0, height=0; Square(int angle, int width, int height) { this.angle=angle; this.width=width; this.height=height; } @Override public void paint(Graphics g) //Graphics g используется для рисования. { Graphics2D g2=(Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Path2D.Double path = new Path2D.Double();
path.moveTo(width, -21 + height); path.lineTo(5 + width, -6 + height); path.lineTo(20 + width, -6 + height); path.lineTo(8 + width, 3 + height); path.lineTo(13 + width, 18 + height); path.lineTo(width, 9 + height); path.lineTo(-13 + width, 18 + height); path.lineTo(-8 + width, 3 + height); path.lineTo(-20 + width, -6 + height); path.lineTo(-5 + width, -6 + height); path.closePath(); path.transform(at); g2.setColor(Color.RED); g2.draw(path); g2.fill(path); } public void rotateRect() { at.rotate(Math.toRadians(angle), width, height); }
}
|
буду очень благодарен за помощь!
|