2014-11-25 4 views
0

У меня есть простой компонент, который я хочу моргать каждый раз, когда мое приложение получает «сообщение». В настоящее время я создаю новый поток, чтобы «осветить» компонент, спать, а затем сбросить компонент. Как я мог добиться этого лучше? Я знаю, что потоки дороги.Самый эффективный способ мигать светом

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

Предложение: сделать окончательный '' int's частного конечного ИНТ TOP = 1', 'частное окончательное ИНТ MIDDLE = 2 'и т. д. Тогда будут выполняться' colors.put (TOP, unit) 'и' colors.put (pos, color) ', без необходимости переключения. Кроме того, сделайте это перечислением, чтобы вы могли проверять тип при передаче параметров. – MirroredFate

+0

@MirroredFate было бы лучше использовать байт? Поскольку это значение будет только когда-либо 1, 2 или 3. Или разница будет незначительной? – globalburning

+1

Наверное, нет. Если вы сильно обеспокоены памятью и пытаетесь сохранить ваши данные как можно компактнее, вы, вероятно, сохраните int в некотором конфигурационном байте данных в виде флагов, т. Е. У вас будет байт, значение которого может быть «0110-0000», где первые три бита будут указывать верхнюю, нижнюю и среднюю, и если бы они были «0», они были бы выключены, и «1» был включен. Но вы работаете на Java, поэтому у вас, вероятно, есть доступная память. Я бы пошел с идеей enum, так как это дает вам более четкий контроль над тем, что происходит. – MirroredFate

ответ

1

Используйте свинг javax.swing.Timer, это повторяемые через регулярные промежутки времени, обеспечивает уровень резьбы изоляции/синхронизации (как это таймер событие в очередь в очереди событий и выполнить в контекстном Event Dispatching Thread по одному) и предотвращает любую возможность нарушения правил одиночной нити Swings.

Альтернативой является использование SwingWorker и использовать его publish/process методов ...

Смежные вопросы