java动画,使对象每 'x'秒改变颜色

标签 java swing flash animation timer

您好,我只是想知道是否有人可以帮助我或给我一些有关计时器的建议,我遇到的问题是我需要一个对象在单击按钮“闪光”时每 x 秒改变一次颜色并保持单击“稳定”按钮时的单色到目前为止,我的按钮已经可以工作了,我似乎无法让对象“闪烁”(自行更改颜色)。我的代码如下,运行没有问题。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


/**
 * Created by joe on 26/03/15.
 */

    class Beacon extends JPanel {
    private boolean lightOn = true;

    private int x = 150;
    private int y = 90;
    private int ballSize = 55;

        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                if (lightOn){
                    g2.setColor(Color.BLACK);
                    g2.fillRect(172, 140, 12, 30);
                    g2.drawRect(172, 170, 11, 30);
                    g2.fillRect(172, 200, 12, 30);
                    g2.drawRect(172, 230, 11, 30);
                    g2.fillRect(172, 260, 12, 30);
                    g2.drawRect(172, 290, 11, 30);
                    g2.fillRect(172, 320, 12, 30);
                    g2.drawRect(172, 350, 11, 30);
                    g2.setColor(Color.ORANGE);
                    g2.fillOval(x, y, ballSize, ballSize);
                }
            else{
        g2.setColor(Color.BLACK);
        g2.fillRect(172, 140, 12, 30);
        g2.drawRect(172, 170, 11, 30);
        g2.fillRect(172, 200, 12, 30);
        g2.drawRect(172, 230, 11, 30);
        g2.fillRect(172, 260, 12, 30);
        g2.drawRect(172, 290, 11, 30);
        g2.fillRect(172, 320, 12, 30);
        g2.drawRect(172, 350, 11, 30);
        g2.setColor(Color.GRAY);
        g2.fillOval(x, y, ballSize, ballSize);
    }   }
    public void lightOn() { lightOn = true; }
    public void lightOff() { lightOn = false; }
}

    public class BeaconViewer extends JFrame
    {
        JButton Flash = new JButton("Flash");
        JButton Steady = new JButton("Steady");
        JPanel bPanel = new JPanel();
        Beacon bbPanel = new Beacon();



    public BeaconViewer()
    {
        bPanel.add(Flash);
        this.add(bPanel, BorderLayout.SOUTH);
        bPanel.add(Steady);
        this.add(bbPanel, BorderLayout.CENTER);
        Flash.addActionListener(new FlashListener());
        Steady.addActionListener(new SteadyListener());
    }

        class FlashListener implements ActionListener {

            public void actionPerformed(ActionEvent e) {
                bbPanel.lightOff();
                repaint();

            }

        }

        class SteadyListener implements ActionListener {

            public void actionPerformed(ActionEvent a) {
                bbPanel.lightOn();
                repaint();
            }

        }

        public static void main(String[] args) {
        JFrame scFrame = new BeaconViewer();
        scFrame.setTitle("Belish Beacon");
        scFrame.setSize(300, 500);
        scFrame.setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE));
        scFrame.setVisible(true); }}

最佳答案

首先查看 How to use Swing Timers

首先,您需要某种方式来判断 Beacon 是否是打开还是关闭,我们通过添加来实现这一点

public boolean isLighOff() {
    return !lightOn;
}

Beacon类。

接下来,我们需要一个 javax.swing.Timer 的实例

public class BeaconViewer extends JFrame {
    //...
    private Timer flashTimer;

    public BeaconViewer() {
        //...
        flashTimer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (bbPanel.isLighOff()) {
                    bbPanel.lightOn();
                } else {
                    bbPanel.lightOff();
                }
                repaint();
            }
        });
        flashTimer.setInitialDelay(0);
    }

这用于安排在指定持续时间(1 秒)进行定期回调,这决定了 Beacon 的当前状态。并切换状态...使用 Swing 的原因 Timer像这样,除了简单之外,还因为从分配的 ActionListener 内修改 UI 组件是安全的。

接下来,我们需要启动并顶部 Timer因此...

class FlashListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        flashTimer.start();
    }

}

class SteadyListener implements ActionListener {

    public void actionPerformed(ActionEvent a) {
        if (flashTimer.isRunning()) {
            flashTimer.stop();
        }
        bbPanel.lightOn();
        repaint();
    }

}

关于java动画,使对象每 'x'秒改变颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337556/

相关文章:

java - Sublime找不到javac命令

java - Long 列表如何检查它是否包含值?

java - setSize 函数造成困惑

actionscript-3 - 更改 MovieClip 内 TextField 的字体颜色

java - Android 闪光灯小部件代码崩溃

flash - 如何添加聊天声音通知?

java - 使用 Java 10 的 jaotc 编译单个类

java - Kotlin 中 ByteArray 和 Array<Byte> 的区别

java - setFrameIcon 的动态 ImageIcon 缩减

java - 为什么我的图像无法保存