import geofasc.swing.Rectangle; import geofasc.swing.tool.Calculator; import java.awt.Color; import java.awt.FlowLayout; /** * Eine LEDBar besteht aus einer Menge von {@link LED}s, die * rasterfoermig angeordnet sind. Eine solche Bar sorgt fuer das zufaellig * verteilte Blinken ihrer {@link LED}s. * * Die rasterförmige Anordnung der {@link LED}s wird über ein {@link FlowLayout} * erreicht. * */ public class LEDBar extends Rectangle { private static final int sLedDiameter = 15; private LED[] mLeds; // Array zum Speichern der Menge von Leds private Thread mLightningThread; // Thread zum nebenlaeufigen Blinken von // Leds /** * Erzeugt eine neue LEDBar bar. * * @param x * die x-Koordinate von bar bez. ihres Eltercontainers * @param y * die y-Koordinate von bar bez. ihres Eltercontainers * @param rows * die Led-Zeilenanzahl von bar * @param cols * die Led-Spaltenanzahl von bar */ public LEDBar(int x, int y, int rows, int cols) { super(x, y, cols * (sLedDiameter + 4), rows * (sLedDiameter + 4)); mLeds = new LED[rows * cols]; setLayout(new FlowLayout(FlowLayout.CENTER, 2, 2)); setFigureFilled(true); setFigureFillColor(Color.BLACK); fillWithLeds(); } /** * Erzeugt die einzelnen Leds und fuegt diese rasterfoermig dieser LEDBar * hinzu. */ private void fillWithLeds() { for (int i = 0; i < mLeds.length; i++) { mLeds[i] = new LED(0, 0, sLedDiameter, getRandomColor(), Color.LIGHT_GRAY); add(mLeds[i]); } } /** * Gibt eine zufaellig erzeugte Farbe wieder. * * @return eine Farbe */ private Color getRandomColor() { Calculator calc = new Calculator(); int r = calc.randomInt(0, 255); int g = calc.randomInt(0, 255); int b = calc.randomInt(0, 255); return new Color(r, g, b); } /** * Startet das Blinken zufaellig ausgewaehlter LEDs. */ public void startBlinking() { if (mLightningThread == null) { mLightningThread = new Thread() { @Override public void run() { try { Calculator calc = new Calculator(); while (true && !isInterrupted()) { // Bis hierher technischer Code // -------------------------------------- int i = calc.randomInt(0, mLeds.length - 1); mLeds[i].doSwitch(); sleep(calc.randomInt(20, 100)); // -------------------------------------- // Ab hier wieder technischer Code } } catch (InterruptedException e) { } } }; mLightningThread.start(); } } /** * Stoppt das Blinken zufaellig ausgewaehlter LEDs. */ public void stopBlinking() { if (mLightningThread != null) { mLightningThread.interrupt(); mLightningThread = null; } } }