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;
}
}
}