我有一个简单的组件,每当我的应用程序收到"消息时,我想要闪烁#34;。目前我正在创建一个新的线程来点亮'组件,休眠,然后重置组件。我怎么能以更好的方式实现这个目标?我知道线程很贵。
public class StatusLights extends JComponent {
private static final Color unlit = Color.lightGray;
private HashMap<String, Color> colors = new HashMap<String, Color>();
public StatusLights() {
// start with no colors
colors.put("TOP", unlit);
colors.put("MIDDLE", unlit);
colors.put("BOTTOM", unlit);
}
// 1 = top 2 = mid 3 = bottom
public void light(Color color, int pos) {
switch (pos) {
case (1): {
colors.put("TOP", color);
break;
}
case (2): {
colors.put("MIDDLE", color);
break;
}
case (3): {
colors.put("BOTTOM", color);
break;
}
default: {
// not valid position
}
}
repaint();
}
public void clear() {
colors.put("TOP", unlit);
colors.put("MIDDLE", unlit);
colors.put("BOTTOM", unlit);
repaint();
}
public void blink(final Color color, final int i) {
new Thread(new Runnable() {
public void run() {
light(color, i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clear();
}
}).start();
}
}
答案 0 :(得分:1)
使用Swing javax.swing.Timer
,它可以在一个固定的时间间隔重复,提供一个级别的线程隔离/同步(因为它定时器事件在事件队列中排队,并在上下文中执行事件调度线程一个时间)并防止任何违反Swings单线程规则的可能性。
另一种方法是使用SwingWorker
并使用其publish
/ process
方法......