import geofasc.swing.Circle;
import java.awt.Color;
/**
* Eine LED
hat die festgelegten Zustände an
,
* aus
und blinkend
. Beim Uebergang und Befinden in
* diesen Zustaenden loest eine LED
eine passende Aktion aus.
*/
public class LED extends Circle {
private int mState;
private Color mOnColor;
private Color mOffColor;
private Thread mBlinkThread;
/**
* Erzeugt eine neue LED
led.
*
* @param x
* die x-Koordinate von led bez. des Eltercontainers
* @param y
* die y-Koordinate von led bez. des Eltercontainers
* @param diameter
* der Durchmesser von led
* @param onColor
* die An-Farbe von led
* @param offColor
* die Aus-Farbe von led
*/
public LED(int x, int y, int diameter, Color onColor, Color offColor) {
super(x, y, diameter);
setFigureFilled(true);
mOnColor = onColor;
mOffColor = offColor;
mState = 2;
actionOff();
}
/**
* Schaltet die verschiedenen Zustaende dieser LED durch.
*/
public void doSwitch() {
if (mState == 0) { // off -> on
mState = mState + 1;
actionOn();
} else if (mState == 1) { // on -> blinking
mState = mState + 1;
actionBlinking();
} else if (mState == 2) { // blinking -> off
mState = 0;
actionOff();
}
}
/**
* Eine ausgeloeste Aktion.
*/
private void actionOn() {
interruptBlinkingThread();
setFigureFillColor(mOnColor);
}
/**
* Eine ausgeloeste Aktion.
*/
private void actionOff() {
interruptBlinkingThread();
setFigureFillColor(mOffColor);
}
/**
* Eine ausgeloeste Aktion.
*/
private void actionBlinking() {
if (mBlinkThread != null)
return;
mBlinkThread = new Thread() {
public void run() {
try {
// Bis hierher technischer Code
// --------------------------------------
while (mState == 2 && !isInterrupted()) {
setFigureFillColor(mOnColor);
sleep(100);
setFigureFillColor(mOffColor);
sleep(300);
}
// --------------------------------------
// Ab hier wieder technischer Code
} catch (Exception e) {
}
};
};
mBlinkThread.start();
}
/**
* Loest eine Unterbrechungsanforderung fuer den Thread zum nebenlaeufigen
* Blinken aus.
*/
private void interruptBlinkingThread() {
if (mBlinkThread != null) {
mBlinkThread.interrupt();
mBlinkThread = null;
}
}
}