随着时间的推移更改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();
目前这项工作,但它只是在指定的时间内将默认颜色更改为新的选定颜色。
答
可以使用以下代码:
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)
。
你想淡淡的颜色? – MadProgrammer
颜色混合[示例](https://*.com/questions/21270610/java-smooth-color-transition/21270957#21270957),[示例](https://*.com/questions/13223065/color-衰落算法/ 13223818#13223818) – MadProgrammer
它不需要交叉淡化 – mth