【发布时间】:2015-03-30 02:38:14
【问题描述】:
嗨,我只是想知道是否有人可以帮助我或给我一些有关计时器的建议,我遇到的问题是我需要一个对象在单击按钮“flash”时每 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); }}
【问题讨论】:
-
不要创建两个方法(lightOn() 和 lightOff)。通常,要管理类中的属性,您将拥有一个“getter”和一个“setter”方法。所以在你的情况下,因为你调用你的变量名是
lightOn,我建议你创建两个方法isLightOn()和setLightOn(boolean lightOn)。然后在setLightOn(...)方法中调用repaint(),这样您的属性的新状态就可以反映在GUI 上。
标签: java swing flash animation timer