123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /*
- * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
- * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
- */
-
- package aufgabe8_grafik2d;
-
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.geom.Line2D;
- import static java.lang.Math.*;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- import java.util.logging.Logger;
- import javax.swing.JComponent;
-
- /**
- * Klasse für selbst gezeichnete Zeiger, die sich über einenn eigenen Thread
- * drehen können.
- * @author Je-To
- */
- public class Zeiger extends JComponent implements Runnable
- {
- private Logger lg = Logger.getLogger("grafik");
- private static final float DICKE = 4f;
- private Line2D.Float linie;
- private BasicStroke stift;
- private volatile double radius;
- private volatile float xMitte;
- private volatile float yMitte;
- private volatile double xAussen;
- private volatile double yAussen;
- private volatile double alpha;
- private long schlafzeit;
- private int zeigerlaenge;
- private ExecutorService eService;
- private Future task;
-
- /**
- * Initialisierung des Zeigers
- * @param schlafzeit = Zeit, die der Thread wartet, bevor der Zeiger sich
- * wieder weiterbewegt
- * @param zeigerlaenge = verhältnismäßige Zeigerlänge
- */
- public Zeiger(long schlafzeit, int zeigerlaenge)
- {
- this.schlafzeit = schlafzeit;
- this.zeigerlaenge = zeigerlaenge;
- linie = new Line2D.Float();
- stift = new BasicStroke(DICKE);
- alpha = 0;
- eService = Executors.newSingleThreadExecutor();
- task = null;
- }
-
- /**
- * Thread für das Ändern des Winkels
- */
- @Override
- public void run()
- {
- while(true)
- {
- synchronized(this)
- {
- alpha += 0.08;
- }
- this.repaint();
- try
- {
- Thread.sleep(schlafzeit);
- }
- catch (Exception ex)
- {
- lg.severe(ex.toString());
- }
- }
- }
-
- public void start()
- {
- if (task == null)
- {
- task = eService.submit(this);
- }
- }
-
- /**
- * Zeichnen des Zeigers abhängig vom Winkel Alpha
- * @param g
- */
- @Override
- public void paintComponent(Graphics g)
- {
- super.paintComponent(g);
- Graphics2D g2 = (Graphics2D)g;
-
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
- float breite = this.getWidth() - 1;
- float hoehe = this.getHeight() - 1;
-
- radius = (min(hoehe, breite)/2 * 0.9) * 1/ zeigerlaenge;
-
- xMitte = breite/2;
- yMitte = hoehe/2;
-
- synchronized(this)
- {
- xAussen = xMitte +cos(2*PI*alpha) * radius;
- yAussen = yMitte + sin(2*PI*alpha) * radius;
- }
-
- linie.setLine(xMitte, yMitte, xAussen, yAussen);
-
- g2.setStroke(stift);
- g2.setPaint(Color.RED);
- g2.draw(linie);
- }
- }
-
|