今天模拟书上的一个例题做了一个弹弹球,是在画布上的指定位置画多个圆,经过一段的延时后,在附近位置重新画。使球看起来是动,通过JSpinner组件调节延时,来控制弹弹球的移动速度.
BallsCanvas.java
public class BallsCanvas extends Canvas implements ActionListener,
FocusListener {
private Ball balls[]; // 多个球
private Timer timer;
private static class Ball {
int x, y; // 坐标
Color color; // 颜色
boolean up, left; // 运动方向
Ball(int x, int y, Color color) {
this.x = x;
this.y = y;
this.color = color;
up = left = false;
}
}
public BallsCanvas(Color colors[], int delay) { // 初始化颜色、延时
this.balls = new Ball[colors.length];
for (int i = 0, x = 40; i < colors.length; i++, x += 40) {
balls[i] = new Ball(x, x, colors[i]);
}
this.addFocusListener(this);
timer = new Timer(delay, this); // 创建定时器对象,delay指定延时
timer.start();
}
// 设置延时
public void setDelay(int delay) {
timer.setDelay(delay);
}
// 在canvas上面作画
public void paint(Graphics g) {
for (int i = 0; i < balls.length; i++) {
g.setColor(balls[i].color); // 设置颜色
balls[i].x = balls[i].left ? balls[i].x - 10 : balls[i].x + 10;
if (balls[i].x < 0 || balls[i].x >= this.getWidth()) { // 到水平方向更改方向
balls[i].left = !balls[i].left;
}
balls[i].y = balls[i].up ? balls[i].y - 10 : balls[i].y + 10;
if (balls[i].y < 0 || balls[i].y >= this.getHeight()) { // 到垂直方向更改方向
balls[i].up = !balls[i].up;
}
g.fillOval(balls[i].x, balls[i].y, 20, 20); // 画指定直径的圆
}
}
// 定时器定时执行事件
@Override
public void actionPerformed(ActionEvent e) {
repaint(); // 重画
}
// 获得焦点
@Override
public void focusGained(FocusEvent e) {
timer.stop(); // 定时器停止
}
// 失去焦点
@Override
public void focusLost(FocusEvent e) {
timer.restart(); // 定时器重启动
}
}
BallsJFrame.java
class BallsJFrame extends JFrame implements ChangeListener {
private BallsCanvas ball;
private JSpinner spinner;
public BallsJFrame() {
super("弹弹球");
this.setBounds(300, 200, 480, 360);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Color colors[] = { Color.red, Color.green, Color.blue,
Color.magenta, Color.cyan };
ball = new BallsCanvas(colors, 100);
this.getContentPane().add(ball);
JPanel panel = new JPanel();
this.getContentPane().add(panel, "South");
panel.add(new JLabel("Delay"));
spinner = new JSpinner();
spinner.setValue(100);
panel.add(spinner);
spinner.addChangeListener(this);
this.setVisible(true);
}
@Override
public void stateChanged(ChangeEvent e) {
// 修改JSpinner值时,单击JSpinner的Up或者down按钮时,或者在JSpinner中按Enter键
ball.setDelay(Integer.parseInt("" + spinner.getValue()));
}
public static void main(String[] args) {
new BallsJFrame();
}
}
效果如下:
分享到:
相关推荐
一个定时器实现多个虚拟定时器具体代码实现
我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就...当然不是,我们能用定时器来实现灯的闪烁的功能。 例1:查询方式 OR......
定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用定时器的使用
VC++在非窗口类中使用定时器timer
C++定时器实现,简单易懂,高效
这是一个很综合的例子,有非窗口怎么使用定时器,静态函数怎么访问非静态函数,很不错的例子!
主要介绍了Java中的定时器及使用定时器制作弹弹球游戏的示例,文中同时也分析了定时器timer的缺点及相关替代方案,需要的朋友可以参考下
已知的多种方式实现的js定时器功能。支持延缓加载功能。
本文章就编写点亮LED与打印输出的示例来讲解使用方法。在这直接进入正题。(在此不做创建项目的步骤介绍) 1、STM32CubeIDE 配置 LED管脚配置 串口1配置(也就是debug串口) 2、代码 usart.c文件 /* USER CODE ...
8253定时器实现方波输出 课程设计 8253定时器实现方波输出 课程设计
经典的转速测试程序,可以移植到许多工程应用上,只需作很小的改动即可!主要用的定时器0通道输入捕捉中断实现周期的测量。
C#多线程实现定时器
QT实战,利用定时器QTimer实现图片的移动!主要是练习QT资源文件的添加及使用方法,及定时器方法和功能。
VC++ 定时器使用 定时器使用 VC++ 定时器使用 定时器使用
MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用MFC定时器的使用
STM32定时器实现跑马灯
555定时器实现救护车报警,使用Multisim12打开即可
(单片机开发)使用T2定时器实现1秒精确定时
AVR使用范例--定时器实现PWM功能
定时器使用定时器使用定时器使用定时器使用定时器使用定时器使用定时器使用定时器使用定时器使用