2013-09-18 3 views
0

Я пытаюсь сделать несколько JRadioButtons мигать одновременно с этим методом мигания:Java: Запуск нескольких в то время как петли в то же время

private void blink(JRadioButton button, boolean blinking) 
{ 
    if(blinking) 
    { 
     while(true) 
     { 
      try 
      { 
       button.setSelected(true); 
       Thread.sleep(500); 
       button.setSelected(false); 
       Thread.sleep(500); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
    else 
    { 
     button.setSelected(false); 
    } 
} 

Я знаю, что есть что-то делать с потоками, но я» не знакомы с ними.

ответ

3

Я пытаюсь сделать несколько JRadioButton, мигает одновременно с этим методом мигания

ИМХИ Вам не нужен мультипликатор то время как петля.

Просто добавьте все кнопки, которые вы хотите мигать, на ArrayList, затем в том же while петле, перейдете через этот список и начните мигать кнопками. Таким образом, вместо

button.setSelected(true); 
Thread.sleep(500); 
button.setSelected(false); 
Thread.sleep(500); 

Вы можете использовать

for(int i=0; i<yourList.size(); i++) { 
    yourList.get(i).setSelected(true); 
} 
Thread.sleep(500); 
for(int i=0; i<yourList.size(); i++) { 
    yourList.get(i).setSelected(false); 
} 
Thread.sleep(500); 

Но это плохая практика. Используйте Timer класс и планировать поток для выполнения каждые 500 мс вместо:

Timer t = new Timer(500, new ActionListener() { 
    boolean selected = false; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     selected = !selected; 
     for(int i=0; i<yourList.size(); i++) { 
      yourList.get(i).setSelected(selected); 
     } 
    } 
}); 
t.start(); 
3

Вы не можете анимировать GUI с помощью Thread.sleep. На самом деле, вы никогда не должны звонить Thread.sleep в тему «Диспетчер событий», потому что именно этот поток отвечает за перерисовку графического интерфейса, который он явно не сможет сделать во время сна.

Вы должны использовать класс Swing Timer и планировать его повторение с требуемым интервалом.

+0

Возможно, что опубликованный код работает в другом потоке (а не в EDT). Но это, конечно, по-прежнему не так, поскольку вы не должны вызывать методы Swing из другого потока. – davmac

+0

@ davmac Точно. И если код должен был быть исправлен с помощью 'invokeLater', тогда он превратился бы в уродливый беспорядок и использовал бы лишний поток для хорошей цели. –

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