2013-07-15 4 views
0

У меня есть фон для моего экрана заголовка моей программы и вы хотите, чтобы его цвет медленно менялся со временем. Вот как нарисованы фон:Изменить значения RGB цвета со временем

g.setColor(255, 0, 0); 
g.fillRect(0, 0, 640, 480); //g is the Graphics Object 

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

int red = 255; 
int green = 0; 
int blue = 0; 

long timer = System.nanoTime(); 
long elapsed = (System.nanoTime() - timer)/1000000; 

if(elapsed > 100) { 
    red--; 
    green++; 
    blue++; 
} 

g.setColor(red, green, blue); 
g.fillRect(0, 0, 640, 480); 

я сделал больше кода, чтобы сделать это так, если любое из значений достиг 0, они будут добавлены, и если они достигли 255 они будут вычтены, но вы получите идею. И это было в методе рендера, который назывался 60 раз в секунду. (переменная таймера была создана вне метода рендеринга)

Спасибо!

+0

вы пытались что-нибудь для достижения этой цели? – Makky

+0

@Makky Я просто добавил, что в. – sparklyllama

+0

Разве это не работает? – Makky

ответ

0

Используйте поворот Timer, чтобы установить новый цвет фона в вертикальной плоскости. Для расчета нового цвета вы можете использовать Color.HSBtoRGB(), изменяя компонент оттенка каждый раз, когда таймер активирован.

0

Как предложено kiheru, вы должны использовать Таймер.

Вот пример.

при запуске этого он изменит цвет фона панели каждый второй (я использую случайный цвет)

import java.awt.Color; 
import java.awt.EventQueue; 
import java.util.Date; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestColor { 

    private JFrame frame; 
    private JPanel panel; 
    private Timer timer; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TestColor window = new TestColor(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public TestColor() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 

     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     panel = new JPanel(); 
     panel.setBounds(23, 61, 354, 144); 
     frame.getContentPane().add(panel); 
     timer = new Timer(); 
     TimerClass claa = new TimerClass(); 
     timer.scheduleAtFixedRate(claa, new Date(), 1000); 
    } 

    private class TimerClass extends TimerTask { 

     @Override 
     public void run() { 

      panel.setBackground(randomColor()); 

     } 

    } 

    public Color randomColor() { 
     Random random = new Random(); // Probably really put this somewhere 
             // where it gets executed only once 
     int red = random.nextInt(256); 
     int green = random.nextInt(256); 
     int blue = random.nextInt(256); 
     return new Color(red, green, blue); 
    } 
} 
+0

В то время как технически Правильно, этот ответ нарушает правила единственного потока Swing. Прочтите [Диспетчер событий] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html) для получения более подробной информации. – MadProgrammer

+0

Спасибо @MadProgrammer. Я буду помнить об этом. – Makky

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