2013-07-15 3 views
0

내 프로그램의 내 제목 화면 배경이 있으며 시간이 지남에 따라 색상이 천천히 변경되기를 원합니다. 이것은 배경이 그려지는 방법입니다 :시간별 색상의 RGB 값 변경

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

그래서 지금 배경은 빨간색입니다. 나는 그것이 서서히 녹색으로 사라지기를 원하고, 파란색으로, 그리고 다시 빨간색으로 되돌아 가기를 원합니다. 나는 임의의 값이 0에 도달하면 그렇게, 그들은 추가 될 수 있도록 더 많은 코드를했다

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); 

하고 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의 단일 스레드 규칙을 위반합니다. 자세한 내용은 [The Event Dispatching] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)을 통해 읽으십시오. – MadProgrammer

+0

고마워요 @MadProgrammer 저는 이것을 염두에 두겠습니다. – Makky

관련 문제