You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Zeiger.java 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
  3. * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
  4. */
  5. package aufgabe8_grafik2d;
  6. import java.awt.BasicStroke;
  7. import java.awt.Color;
  8. import java.awt.Graphics;
  9. import java.awt.Graphics2D;
  10. import java.awt.RenderingHints;
  11. import java.awt.geom.Line2D;
  12. import static java.lang.Math.*;
  13. import java.util.concurrent.ExecutorService;
  14. import java.util.concurrent.Executors;
  15. import java.util.concurrent.Future;
  16. import java.util.logging.Logger;
  17. import javax.swing.JComponent;
  18. /**
  19. * Klasse für selbst gezeichnete Zeiger, die sich über einenn eigenen Thread
  20. * drehen können.
  21. * @author Je-To
  22. */
  23. public class Zeiger extends JComponent implements Runnable
  24. {
  25. private Logger lg = Logger.getLogger("grafik");
  26. private static final float DICKE = 4f;
  27. private Line2D.Float linie;
  28. private BasicStroke stift;
  29. private volatile double radius;
  30. private volatile float xMitte;
  31. private volatile float yMitte;
  32. private volatile double xAussen;
  33. private volatile double yAussen;
  34. private volatile double alpha;
  35. private long schlafzeit;
  36. private int zeigerlaenge;
  37. private ExecutorService eService;
  38. private Future task;
  39. /**
  40. * Initialisierung des Zeigers
  41. * @param schlafzeit = Zeit, die der Thread wartet, bevor der Zeiger sich
  42. * wieder weiterbewegt
  43. * @param zeigerlaenge = verhältnismäßige Zeigerlänge
  44. */
  45. public Zeiger(long schlafzeit, int zeigerlaenge)
  46. {
  47. this.schlafzeit = schlafzeit;
  48. this.zeigerlaenge = zeigerlaenge;
  49. linie = new Line2D.Float();
  50. stift = new BasicStroke(DICKE);
  51. alpha = 0;
  52. eService = Executors.newSingleThreadExecutor();
  53. task = null;
  54. }
  55. /**
  56. * Thread für das Ändern des Winkels
  57. */
  58. @Override
  59. public void run()
  60. {
  61. while(true)
  62. {
  63. synchronized(this)
  64. {
  65. alpha += 0.08;
  66. }
  67. this.repaint();
  68. try
  69. {
  70. Thread.sleep(schlafzeit);
  71. }
  72. catch (Exception ex)
  73. {
  74. lg.severe(ex.toString());
  75. }
  76. }
  77. }
  78. public void start()
  79. {
  80. if (task == null)
  81. {
  82. task = eService.submit(this);
  83. }
  84. }
  85. /**
  86. * Zeichnen des Zeigers abhängig vom Winkel Alpha
  87. * @param g
  88. */
  89. @Override
  90. public void paintComponent(Graphics g)
  91. {
  92. super.paintComponent(g);
  93. Graphics2D g2 = (Graphics2D)g;
  94. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  95. float breite = this.getWidth() - 1;
  96. float hoehe = this.getHeight() - 1;
  97. radius = (min(hoehe, breite)/2 * 0.9) * 1/ zeigerlaenge;
  98. xMitte = breite/2;
  99. yMitte = hoehe/2;
  100. synchronized(this)
  101. {
  102. xAussen = xMitte +cos(2*PI*alpha) * radius;
  103. yAussen = yMitte + sin(2*PI*alpha) * radius;
  104. }
  105. linie.setLine(xMitte, yMitte, xAussen, yAussen);
  106. g2.setStroke(stift);
  107. g2.setPaint(Color.RED);
  108. g2.draw(linie);
  109. }
  110. }