您好,我只是想知道是否有人可以帮助我或给我一些有关计时器的建议,我遇到的问题是我需要一个对象在单击按钮“闪光”时每 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); }}
最佳答案
首先,您需要某种方式来判断 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/