随着时间的推移更改ContentPane背景颜色

问题描述:

我想在一段时间内在ContentPane上更改背景。类随着时间的推移更改ContentPane背景颜色

我已经设置默认的背景颜色

getContentPane().setBackground(Color.white);     

,然后ButtonActionPerformed我希望用户选择另一种颜色,然后如果不是空的背景应更改为颜色(默认的和所选择的一个)

Color bgC = JColorChooser.showDialog(null, "Choose color: ", Color.yellow); 
    if (bgC != null) 

    { 
    Timer bT = new Timer (TIMER_DELAY, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    getContentPane().setBackground(bgC); 
    } 
    }); 

    bT.start(); 

目前这项工作,但它只是在指定的时间内将默认颜色更改为新的选定颜色。

+0

你想淡淡的颜色? – MadProgrammer

+0

颜色混合[示例](https://*.com/questions/21270610/java-smooth-color-transition/21270957#21270957),[示例](https://*.com/questions/13223065/color-衰落算法/ 13223818#13223818) – MadProgrammer

+0

它不需要交叉淡化 – mth

可以使用以下代码:

import java.awt.Color; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.function.Consumer; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class Main { 
    public static class Blinker { 
     private Color color1; 
     private Timer timer; 
     private Consumer<Color> setColor; 
     private int timesBlinked; 

     public Blinker(int delay, int blinkTimes, Color color1, Color color2, Consumer<Color> setColor) { 
      this.color1 = color1; 
      this.setColor = setColor; 
      timesBlinked = 0; 
      timer = new Timer(delay, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (timesBlinked < blinkTimes) { 
         if (timesBlinked % 2 == 0) 
          setColor.accept(color2); 
         else 
          setColor.accept(color1); 
         ++timesBlinked; 
        } 
        else 
         stop(); 
       } 
      }); 
     } 

     private void stop() { 
      timer.stop(); 
     } 

     public void start() { 
      setColor.accept(color1); 
      timer.start(); 
     } 
    } 

    public static void startBlink(int delay, int blinkTimes, Color color1, Color color2, Consumer<Color> setColor) { 
     new Blinker(delay, blinkTimes, color1, color2, setColor).start(); 
    } 

    public static class YourJFrame extends JFrame { 
     public YourJFrame(String title) { 
      super(title); 

      JButton button = new JButton("Choose color"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Color bgC = JColorChooser.showDialog(null, "Choose color: ", Color.YELLOW); 
        if (bgC != null) 
         startBlink(500, 7, getContentPane().getBackground(), bgC, c -> getContentPane().setBackground(c)); //Change the number arguments at will. 
       } 
      }); 

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      getContentPane().setLayout(new GridBagLayout()); //Just to keep the button centered. 
      getContentPane().add(button); 
      getContentPane().setBackground(Color.WHITE); 
      pack(); 
      setLocationRelativeTo(null); 
      setVisible(true); 
     } 
    } 

    public static void main(final String[] args) { 
     new YourJFrame("Blinker frame").setSize(250, 250); 
    } 
} 

startBlink方法的delay参数确定闪烁的速度。
数字越小,速度越快。

blinkTimes参数startBlink方法确定颜色闪烁(交替)的次数。
记住保留这个奇数次数,如果你想颜色被最终改变。

您可以将类Blinker和方法startBlink复制到您的代码以开始。

+0

太棒了!谢谢!我已经设法像这样实现它 – mth

是这样的:

Timer bT = new Timer (TIMER_DELAY, new ActionListener() { 
    static final int[] startRGB = { 255, 255, 255 }; 
    int[] endRGB = { bg.getRed(), bg.getGreen(), bg.getBlue() }; 
    int pct = 0; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ++pct; 

     int[] rgb = new int[3]; 
     for (int i = 0; i < 3; ++i) { 
      rgb[i] = (pct*startRGB[i] + (100 - pct)*endRGB[]i])/100; 
     } 
     getContentPane().setBackground(new Color(rgb[0], rgb[1], rgb[2])); 
     repaint(50L); 
     if (pct == 100) { 
      stop(); 
     } 
    } 
}); 

这里100步,使用百分比pct和步长1

定时器应该有setRepeats(true)