1. 创建一个基本的窗口
首先,我们需要创建一个窗口来显示绘制的气球。我们可以使用JFrame
类来创建一个窗口,并将一个Canvas
添加到窗口中。
import java.awt.Canvas;
import javax.swing.JFrame;
public class BalloonWindow extends JFrame {
public BalloonWindow() {
// 设置窗口标题
super("Balloon Window");
// 创建并添加一个Canvas
Canvas canvas = new BalloonCanvas();
getContentPane().add(canvas);
}
public static void main(String[] args) {
// 创建窗口并显示它
BalloonWindow window = new BalloonWindow();
window.setSize(400, 600);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
在这个代码中,BalloonWindow
类继承自JFrame
,并在构造函数中创建了一个BalloonCanvas
的实例,并将其添加到窗口的内容面板中。在main
方法中,我们创建了一个BalloonWindow
实例,并设置了窗口的大小和关闭操作。
2. 绘制气球
接下来,我们需要在BalloonCanvas
类中实现paint
方法来绘制气球。首先,我们需要定义代表气球位置和大小的成员变量。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
public class BalloonCanvas extends Canvas {
// 气球圆心坐标和半径
private int x = 200;
private int y = 400;
private int radius = 50;
@Override
public void paint(Graphics g) {
// 设置气球颜色
g.setColor(Color.RED);
// 绘制气球
g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
}
}
在paint
方法中,我们将画笔的颜色设置为红色,然后使用fillOval
方法绘制一个"填充"红色的圆形。我们使用成员变量x
和y
表示气球的圆心坐标,radius
表示气球的半径。
如果现在运行程序,将会在窗口中显示一个红色的气球。
3. 使气球上升
为了使气球开始上升,我们需要在BalloonCanvas
类中添加一些状态变量和更新它们的代码。我们可以添加一个布尔变量rising
来表示气球当前是否正在上升。在run
方法中,我们将气球的y
坐标减小一定量(即dy
),从而使气球上升。当气球到达顶部(即y - radius <= 0
)时,我们将rising
变量设置为false
,从而停止上升。然后,气球将开始下降。
public class BalloonCanvas extends Canvas implements Runnable {
// 气球圆心坐标和半径
private int x = 200;
private int y = 400;
private int radius = 50;
private int dy = 5; // 上升速度
private boolean rising = true;
public BalloonCanvas() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void paint(Graphics g) {
g.setColor(Color.RED);
g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
}
@Override
public void run() {
while (true) {
if (rising) {
y -= dy;
if (y - radius <= 0) {
rising = false;
}
} else {
y += dy;
if (y + radius >= getHeight()) {
break;
}
}
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在上面的代码中,我们实现了Runnable
接口,从而可以在BalloonCanvas
的构造函数中创建一个新线程,并在其中执行run
方法。在run
方法中,我们检查气球是否正在上升(即rising
变量为true
),如果是,我们将y
坐标减去dy
,即上升气球的速度。当气球到达顶部时,我们将rising
变量设置为false
,表示气球需要开始下降。然后在下降状态下,我们将y
坐标增加dy
。我们使用getHeight
方法来获取窗口的高度,以确保气球不会超出窗口的底部。
最后,我们在run
方法的末尾调用repaint
方法,以便在改变气球位置后重新绘制它。我们在每个循环中使用Thread.sleep
方法来暂停执行一段时间,以便我们可以看到气球上升和下降的效果。
4. 运行程序
现在我们已经完成了气球上升的Java程序。要运行程序,就会看到一个红色的气球在窗口中上升和下降。
以下为完整代码
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class BalloonWindow extends JFrame {
public BalloonWindow() {
// 设置窗口标题
super("Balloon Window");
// 创建并添加一个Canvas
Canvas canvas = new BalloonCanvas();
getContentPane().add(canvas);
}
public static void main(String[] args) {
// 创建窗口并显示它
BalloonWindow window = new BalloonWindow();
window.setSize(400, 600);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
class BalloonCanvas extends Canvas implements Runnable {
// 气球圆心坐标和半径
private int x = 200;
private int y = 400;
private int radius = 50;
private int dy = 5; // 上升速度
private boolean rising = true;
public BalloonCanvas() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void paint(Graphics g) {
g.setColor(Color.RED);
g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
}
@Override
public void run() {
while (true) {
if (rising) {
y -= dy;
if (y - radius <= 0) {
rising = false;
}
} else {
y += dy;
if (y + radius >= getHeight()) {
break;
}
}
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}