要创建一个简单的 "雨" 效果,我们可以使用Java的Thread
类来模拟雨滴下落的过程。以下是一个简单的例子:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class RainPanel extends JPanel implements ActionListener {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
private static final int RAIN_DROPS = 50;
private static final int SPEED = 3;
private static final int RANDOM_START_Y = 50;
private static final int RANDOM_START_X = 50;
private static final int RANDOM_WIDTH = 5;
private static final int RANDOM_HEIGHT = 5;
private BufferedImage rainImage;
private Timer timer;
private int[] xPositions;
private int[] yPositions;
public RainPanel() {
// Load the rain image
try {
rainImage = new ImageIcon(getClass().getResource("rain.png")).getImage();
} catch (Exception e) {
e.printStackTrace();
}
// Initialize the positions of the rain drops
xPositions = new int[RAIN_DROPS];
yPositions = new int[RAIN_DROPS];
for (int i = 0; i < RAIN_DROPS; i++) {
xPositions[i] = RANDOM_START_X + (int) (Math.random() * (WIDTH - RANDOM_START_X));
yPositions[i] = RANDOM_START_Y + (int) (Math.random() * (HEIGHT - RANDOM_START_Y));
}
// Set up the timer
timer = new Timer(SPEED, this);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// Draw the rain drops
for (int i = 0; i < RAIN_DROPS; i++) {
Image rainDrop = rainImage.getScaledInstance(RANDOM_WIDTH, RANDOM_HEIGHT, Image.SCALE_SMOOTH);
g2d.drawImage(rainDrop, xPositions[i], yPositions[i], this);
// Move the rain drop down
yPositions[i] += SPEED;
if (yPositions[i] >= HEIGHT) {
// Reset the position if the rain drop goes out of the screen
yPositions[i] = RANDOM_START_Y + (int) (Math.random() * (HEIGHT - RANDOM_START_Y));
xPositions[i] = RANDOM_START_X + (int) (Math.random() * (WIDTH - RANDOM_START_X));
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] args) {
// Create the frame
JFrame frame = new JFrame("Rain Effect");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set the content pane to our panel
RainPanel panel = new RainPanel();
frame.setContentPane(panel);
// Set the size and show the frame
frame.setSize(WIDTH, HEIGHT);
frame.setVisible(true);
}
}
在这个例子中,我们使用了一个Timer
来定期调用actionPerformed
方法,从而更新雨滴的位置并重绘组件。paintComponent
方法中