2014-07-12 19 views
-2

我想知道如何管理值來動態改變JFrame的背景顏色,現在我只能從綠色變爲藍色,反之亦然;這是我需要的顏色:如何知道r,g,b值用於獲取其他顏色動態繪製JFrame?

這些顏色的RGB可以發現here

rgb(241, 196, 15)rgb(230, 126, 34)rgb(231, 76, 60)rgb(236, 240, 241)rgb(149, 165, 166)rgb(26, 188, 156)rgb(46, 204, 113)rgb(52, 152, 219)rgb(155, 89, 182)rgb(52, 73, 94)

這裏有一個如何從綠色變爲我的示例代碼動態爲藍色:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class ChangeColor { 

    public ChangeColor() { 
     JFrame frame = new JFrame(); 
     frame.add(new ColorPanel()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public class ColorPanel extends JPanel { 

     private static final int DELAY = 30; 
     private static final int INCREMENT = 15; 
     private Color currentColor = Color.BLUE; 
     boolean isBlue = true; 
     boolean isGreen = false; 
     private int r,g,b; 

     private Timer timer = null; 
     private JButton greenButton = null; 
     private JButton blueButton = null; 

     public ColorPanel() { 
      r = 0; g = 0; b = 255; 

      greenButton = createGreenButton(); 
      blueButton = createBlueButton(); 

      timer = new Timer(DELAY, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 

        if (isBlue) { 
         if (b == 0) { 
          stopTimer(); 
          enableButtons(); 
         } else { 
          blueToGreen(); 
          setColor(new Color(r, b, g)); 
         } 
        } 

        if (isGreen) { 
         if (g == 0) { 
          stopTimer(); 
          enableButtons(); 
         } else { 
          greenToBlue(); 
          setColor(new Color(r, b, g)); 
         } 
        } 

        repaint(); 
       } 
      }); 

      add(blueButton); 
      add(greenButton); 
     } 

     public JButton createBlueButton() { 
      JButton button = new JButton("BLUE"); 
      button.addActionListener(new ActionListener(){ 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (currentColor != new Color(0, 255, 0)) { 
         System.out.println("turn blue"); 
         isBlue = true; 
         isGreen = false; 
         diableButtons(); 
         startTimer(); 
        } 
       } 
      }); 
      return button; 
     } 

     public void diableButtons() { 
      blueButton.setEnabled(false); 
      greenButton.setEnabled(false); 
     } 

     public void enableButtons() { 
      blueButton.setEnabled(true); 
      greenButton.setEnabled(true); 
     } 

     public JButton createGreenButton() { 
      JButton button = new JButton("GREEN"); 
      button.addActionListener(new ActionListener(){ 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (currentColor != new Color(0, 0, 255)) { 
         System.out.println("turn green"); 
         isGreen = true; 
         isBlue = false; 
         diableButtons(); 
         startTimer(); 

        } 
       } 
      }); 
      return button; 
     } 

     private void blueToGreen() { 
      b -= INCREMENT; 
      g += INCREMENT; 
     } 

     private void greenToBlue() { 
      g -= INCREMENT; 
      b += INCREMENT; 
     } 



     public void setColor(Color color) { 
      this.currentColor = color; 
     } 

     public void startTimer() { 
      timer.start(); 
     } 

     public void stopTimer() { 
      timer.stop(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(currentColor); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 300); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       new ChangeColor(); 
      } 
     }); 

    } 
} 

代碼有一些錯誤,這是不是最可靠的代碼,所以,如果你能改善它,我會很感謝

這裏的示例代碼的輸出:

enter image description here

+3

創建的顏色列表,然後遍歷它。 –

+1

你能舉個例子嗎?:) –

+1

這是你的練習;) –

回答

3

你目前的方法確實不容易概括。 「藍色」和「綠色」按鈕的硬編碼部分,特別是像blueToGreen這樣的特殊方法使得不可能通過合理的努力來擴展顏色的數量。 (您不想創建方法blueToYellowblueToRedblueToTheThirdColorFromThisListForWhichIDontKnowAName ...)。

有很多可能的方法來推廣這一點。你沒有多說關於預期的結構和責任。但是您至少應該創建一種方法,可以通過給定數量的步驟在兩個任意顏色之間進行插值。在下面的代碼片段中,這是在'createColorsArrayArgb`方法中完成的,該方法根據任意顏色序列創建一個ARGB顏色數組(最近我需要這個)。但是如果你願意的話,你可以把它煮成2種顏色。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class ChangeColor 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new ChangeColor(); 
      } 
     }); 
    } 

    public ChangeColor() 
    { 
     JFrame frame = new JFrame(); 

     ColorPanel colorPanel = new ColorPanel(Color.BLUE); 
     ColorInterpolator ci = new ColorInterpolator(colorPanel, Color.BLUE); 

     colorPanel.addColorButton(createButton("Blue", Color.BLUE, ci)); 
     colorPanel.addColorButton(createButton("Green", Color.GREEN, ci)); 
     colorPanel.addColorButton(createButton("Red", Color.RED, ci)); 
     colorPanel.addColorButton(createButton("Cyan", Color.CYAN, ci)); 
     colorPanel.addColorButton(createButton("Yellow", Color.YELLOW, ci)); 
     colorPanel.addColorButton(createButton("Magenta", Color.MAGENTA, ci)); 

     frame.add(colorPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static JButton createButton(String name, final Color color, 
     final ColorInterpolator colorInterpolator) 
    { 
     JButton button = new JButton(name); 
     button.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       colorInterpolator.interpolateTo(color); 
      } 
     }); 
     return button; 
    } 


    /** 
    * Creates an array with the given number of elements, that contains the 
    * ARGB representations of colors that are linearly interpolated between the 
    * given colors 
    * 
    * @param steps The number of steps (the size of the resulting array) 
    * @param colors The colors to interpolate between 
    * @return The array with ARGB colors 
    */ 
    static int[] createColorsArrayArgb(int steps, Color... colors) 
    { 
     int result[] = new int[steps]; 
     double normalizing = 1.0/(steps - 1); 
     int numSegments = colors.length - 1; 
     double segmentSize = 1.0/(colors.length - 1); 
     for (int i = 0; i < steps; i++) 
     { 
      double relative = i * normalizing; 
      int i0 = Math.min(numSegments, (int) (relative * numSegments)); 
      int i1 = Math.min(numSegments, i0 + 1); 
      double local = (relative - i0 * segmentSize) * numSegments; 

      Color c0 = colors[i0]; 
      int r0 = c0.getRed(); 
      int g0 = c0.getGreen(); 
      int b0 = c0.getBlue(); 

      Color c1 = colors[i1]; 
      int r1 = c1.getRed(); 
      int g1 = c1.getGreen(); 
      int b1 = c1.getBlue(); 

      int dr = r1 - r0; 
      int dg = g1 - g0; 
      int db = b1 - b0; 

      int r = (int) (r0 + local * dr); 
      int g = (int) (g0 + local * dg); 
      int b = (int) (b0 + local * db); 
      int argb = (0xFF << 24) | (r << 16) | (g << 8) | (b << 0); 
      result[i] = argb; 
     } 
     return result; 
    } 
} 

class ColorInterpolator 
{ 
    private static final int DELAY = 20; 

    private Color currentColor; 
    private int currentIndex = 0; 
    private int currentColorsArgb[]; 
    private final Timer timer; 
    private final ColorPanel colorPanel; 

    ColorInterpolator(final ColorPanel colorPanel, Color initialColor) 
    { 
     this.colorPanel = colorPanel; 

     currentColor = initialColor; 
     currentColorsArgb = new int[]{ initialColor.getRGB() }; 
     timer = new Timer(DELAY, new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       currentIndex++; 
       if (currentIndex >= currentColorsArgb.length-1) 
       { 
        timer.stop(); 
        colorPanel.enableButtons(); 
       } 
       else 
       { 
        int argb = currentColorsArgb[currentIndex]; 
        currentColor = new Color(argb); 
        colorPanel.setColor(currentColor); 
       } 
      } 
     }); 
    } 

    void interpolateTo(Color targetColor) 
    { 
     colorPanel.diableButtons(); 
     currentColorsArgb = ChangeColor.createColorsArrayArgb(
      40, currentColor, targetColor); 
     currentIndex = 0; 
     timer.start(); 
    } 
} 


class ColorPanel extends JPanel 
{ 
    private Color currentColor; 
    private List<JButton> buttons; 

    public ColorPanel(Color initialColor) 
    { 
     currentColor = initialColor; 
     buttons = new ArrayList<JButton>(); 
    } 

    void addColorButton(JButton button) 
    { 
     buttons.add(button); 
     add(button); 
    } 

    public void diableButtons() 
    { 
     for (JButton button : buttons) 
     { 
      button.setEnabled(false); 
     } 
    } 

    public void enableButtons() 
    { 
     for (JButton button : buttons) 
     { 
      button.setEnabled(true); 
     } 
    } 

    public void setColor(Color color) 
    { 
     currentColor = color; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(currentColor); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return new Dimension(600, 300); 
    } 
} 
0
public void actionPerformed(ActionEvent e) { 
    List<Color> colors = new ArrayList<Color>(); 
    colors.add(new Color(0,0,255); 
    colors.add(new Color(255,0,0); 
    colors.add(new Color(0,255,0); 
    // add your other colors 
    for(Color c : colors){ 
      setColor(c) 
      Thread.sleep(1000); //wait 1 second to change the color 
      repaint(); 
    } 
} 
+0

我不知道如果我沒有解釋正確的我想要的,我不想只是改變顏色,我需要的是改變它動畫,從一個到另一個顏色沒有感覺到,有一些平滑 –

3

爲了簡單起見,您可以看看在HSB color coordinates中執行淡入淡出計算。以下示例在兩種色調(綠色和藍色)之間插值,但您也可以通過飽和度和亮度。顏色查找表clut已預先計算並用於定時器的偵聽器。一些相關的例子見here

image

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.LinkedList; 
import java.util.Queue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/** 
* @see https://stackoverflow.com/a/24718561/230513 
*/ 
public class HSBTest { 

    private static final float greenHue = 2/6f; 
    private static final float blueHue = 4/6f; 

    private void display() { 
     JFrame f = new JFrame("HSBTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Fader fader = new Fader(greenHue, blueHue); 
     f.add(fader); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     fader.start(); 
    } 

    private static class Fader extends JPanel implements ActionListener { 

     private final float N = 32; 
     private final Queue<Color> clut = new LinkedList<Color>(); 
     Timer t = new Timer(50, this); 

     public Fader(float h1, float h2) { 
      float d = (h2 - h1)/N; 
      for (int i = 0; i < N; i++) { 
       clut.add(Color.getHSBColor(h1 + d * i, 1, 1)); 
      } 
      for (int i = 0; i < N; i++) { 
       clut.add(Color.getHSBColor(h2 - d * i, 1, 1)); 
      } 
     } 

     private void start() { 
      t.start(); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      this.setBackground(clut.peek()); 
      clut.add(clut.remove()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(256, 128); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new HSBTest().display(); 
      } 
     }); 
    } 
} 
相關問題