2016-04-12 2 views
2

Я пытаюсь сделать JButton пройти цветовой переход и поэтому я добавил слушатель действия к нему, что делает следующее:Цвет Переход на JButton

public void actionPerformed(ActionEvent arg0) { 
    Color c = new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)); 
    Color cc = v.get(1).getBackground(); 
    //(...) The r, rr, b, bb, g, gg are just the components of the colors c and cc 
    boolean boo = true; 
    while(boo){ 
     if(r < rr){ 
      r++; 
     } 
     if(b < bb){ 
      b++; 
     } 
     if(g < gg){ 
      g++; 
     } 
     if(r == rr && b == bb && g == gg){ 
      boo = false; 
     } 
     Color color = new Color(r, b, g); 
     v.get(1).setBackground(color); 
     v.get(0).setBackground(color); 
     frame.repaint(); 
     frame.revalidate(); 
    } 

, но это не делает переход произойдет, это действительно просто изменяет цвет кнопки. Что мне здесь не хватает?

+3

* «Что мне здесь не хватает?» * Не блокируйте EDT (Thread Dispatch Thread). Когда это произойдет, GUI «замерзнет». Подробнее см. [Параллелизм в Swing] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) и исправление («Таймер»). –

ответ

2

Для выполнения этой логики необходимо использовать другой поток и запустить этот поток при действии. Длинные действия блокируют поток, ответственный за графические изменения.

Итак, ваша проблема заключается в том, что вы планируете выполнять каждое графическое изменение в реальном времени, но вместо того, чтобы работать асинхронно с отдельным потоком, вы работаете синхронно, освобождая EDT, когда функция события завершена.

+0

Спасибо! Это сработало!! –

+0

Я рад, что проблема решена. –

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