最有效的方式来眨眼

时间:2014-11-25 19:44:22

标签: java swing

我有一个简单的组件,每当我的应用程序收到"消息时,我想要闪烁#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();
}

}

1 个答案:

答案 0 :(得分:1)

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

另一种方法是使用SwingWorker并使用其publish / process方法......