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

时间:2017-10-17 19:50:44

标签: java swing

我希望在一段时间内在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

此时此功能正常,但它只会在指定的时间内将默认颜色更改为新选择的颜色。

2 个答案:

答案 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)