我希望在一段时间内在ContentPane上更改背景。
我在类
中设置了默认的bg颜色 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();
然后在ButtonActionPerformed我希望用户选择另一种颜色然后如果不为null,背景应该更改为该颜色(默认颜色和所选颜色)
./birhday 10 2000
此时此功能正常,但它只会在指定的时间内将默认颜色更改为新选择的颜色。
答案 0 :(得分:0)
您可以使用以下代码:
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);
}
}
delay
方法的startBlink
参数决定了眨眼的速度
数字越小,速度越快。
blinkTimes
方法的startBlink
参数决定了颜色闪烁(交替)的次数。
如果你想要最终改变颜色,请记住保持奇数次。
您可以将课程Blinker
和方法startBlink
复制到您的代码中以开始使用。
答案 1 :(得分:0)
类似的东西:
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)
。