Java 闪烁灯光的最有效方法

Java 闪烁灯光的最有效方法,java,swing,Java,Swing,我有一个简单的组件,每当我的应用程序收到一条“消息”时,我都希望它闪烁。目前,我正在创建一个新线程来“点亮”组件、睡眠,然后重置组件。我如何才能以更好的方式实现这一点?我知道线很贵 public class StatusLights extends JComponent { private static final Color unlit = Color.lightGray; private HashMap<String, Color> colors = new HashMap&

我有一个简单的组件,每当我的应用程序收到一条“消息”时,我都希望它闪烁。目前,我正在创建一个新线程来“点亮”组件、睡眠,然后重置组件。我如何才能以更好的方式实现这一点?我知道线很贵

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();
}
公共类StatusLights扩展JComponent{
私有静态最终颜色unlight=Color.lightGray;
私有HashMap colors=newhashmap();
公共交通灯(){
//从没有颜色开始
颜色。放置(“顶部”,未点亮);
颜色。放置(“中间”,未点亮);
颜色。放置(“底部”,未点亮);
}
//1=顶部2=中部3=底部
公共空心灯(彩色,内部位置){
开关(pos){
案例(1):{
颜色。放置(“顶部”,颜色);
打破
}
案例(2):{
颜色。放置(“中间”,颜色);
打破
}
案例(3):{
颜色。放置(“底部”,颜色);
打破
}
默认值:{
//无效位置
}
}
重新油漆();
}
公共空间清除(){
颜色。放置(“顶部”,未点亮);
颜色。放置(“中间”,未点亮);
颜色。放置(“底部”,未点亮);
重新油漆();
}
公共无效闪烁(最终颜色,最终int i){
新线程(newrunnable()){
公开募捐{
光(颜色,i);
试一试{
睡眠(300);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
清除();
}
}).start();
}

}

使用Swing
javax.Swing.Timer
,它可以在固定的时间间隔内重复,提供一定级别的线程隔离/同步(因为它的计时器事件在事件队列中排队,并在上下文事件中执行,一次分配一个线程),并防止违反Swings单线程规则的任何可能性


另一种方法是使用
SwingWorker
并利用其
发布
/
过程
方法…

建议:制作final
int
s
private final int TOP=1
private final int MIDDLE=2
,然后
颜色。放置(顶部,未对齐)
,和
颜色。放置(位置,颜色)
将工作,无需开关。或者,将其设置为枚举,以便在传入参数时可以进行类型检查。@MirroredFate使用字节会更好吗?因为该值将仅为1、2或3。或者差别可以忽略不计?可能不会。如果您非常担心内存问题,并试图尽可能紧凑地存储数据,那么您可能会将int存储在数据的某个配置字节中作为标志-即,您将有一个字节,其值可能是
0110-0000
,其中前三位表示顶部、底部和中间,如果它们是
0
,则它们将关闭,
1
将打开。但是您使用的是Java,所以您可能有可用的内存。我同意enum的想法,因为它可以让您更明确地控制将要发生的事情。