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