请设计一个多线程应用程序,实现两个标签在窗口上移动,一个按照圆形轨迹移动,一个按照正方形轨迹移动,移动的半径、边长、初始位置等参数需要在窗口中输入,即参数可调
时间: 2024-03-23 18:40:19 浏览: 14
以下是一个基本的多线程应用程序,可以实现两个标签在窗口上移动,一个按照圆形轨迹移动,一个按照正方形轨迹移动。程序中使用了Java Swing库中的JFrame和JLabel组件,并且通过使用多线程来控制标签的移动。
程序中需要输入的参数包括:圆形轨迹的半径、正方形轨迹的边长、标签的初始位置。这些参数可以通过在程序窗口中添加文本框和按钮来实现。
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MovingLabels extends JFrame implements ActionListener {
private JLabel circleLabel;
private JLabel squareLabel;
private int radius;
private int sideLength;
private int x0;
private int y0;
private int x1;
private int y1;
public MovingLabels() {
super("Moving Labels");
// 创建文本框和按钮,用于输入参数和开始移动标签
JTextField radiusField = new JTextField(5);
JTextField sideLengthField = new JTextField(5);
JTextField x0Field = new JTextField(5);
JTextField y0Field = new JTextField(5);
JButton startButton = new JButton("Start");
startButton.addActionListener(this);
// 创建标签,并设置其初始位置
circleLabel = new JLabel("Circle");
circleLabel.setBounds(0, 0, 50, 20);
squareLabel = new JLabel("Square");
squareLabel.setBounds(0, 0, 50, 20);
// 将组件添加到窗口中
JPanel panel = new JPanel();
panel.add(new JLabel("Radius:"));
panel.add(radiusField);
panel.add(new JLabel("Side Length:"));
panel.add(sideLengthField);
panel.add(new JLabel("Initial X:"));
panel.add(x0Field);
panel.add(new JLabel("Initial Y:"));
panel.add(y0Field);
panel.add(startButton);
add(panel, BorderLayout.NORTH);
add(circleLabel, BorderLayout.CENTER);
add(squareLabel, BorderLayout.SOUTH);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// 获取输入的参数
radius = Integer.parseInt(((JTextField) getContentPane().getComponent(1)).getText());
sideLength = Integer.parseInt(((JTextField) getContentPane().getComponent(3)).getText());
x0 = Integer.parseInt(((JTextField) getContentPane().getComponent(5)).getText());
y0 = Integer.parseInt(((JTextField) getContentPane().getComponent(7)).getText());
// 开始移动标签
new Thread(new CircleRunnable()).start();
new Thread(new SquareRunnable()).start();
}
// 实现圆形轨迹移动的线程
private class CircleRunnable implements Runnable {
public void run() {
double angle = 0;
while (true) {
x0 = (int) (x1 + radius * Math.cos(angle));
y0 = (int) (y1 + radius * Math.sin(angle));
circleLabel.setLocation(x0, y0);
angle += 0.1;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 实现正方形轨迹移动的线程
private class SquareRunnable implements Runnable {
public void run() {
int x = x0;
int y = y0;
int dx = sideLength;
int dy = 0;
while (true) {
x += dx;
y += dy;
if (x < x0 || x > x0 + sideLength || y < y0 || y > y0 + sideLength) {
dx = -dx;
dy = -dy;
}
squareLabel.setLocation(x, y);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new MovingLabels();
}
}
```
在程序中,我们使用了两个内部类CircleRunnable和SquareRunnable来分别实现圆形轨迹移动和正方形轨迹移动。这些内部类实现了Runnable接口,并且在run()方法中实现了标签的移动逻辑。
在程序中,我们使用了while循环来控制标签的移动,而且在每次循环中使用Thread.sleep()方法来使线程暂停一段时间,以便能够看到标签的移动效果。
在程序中,我们还通过实现ActionListener接口来处理开始移动标签的事件。在事件处理程序中,我们获取输入的参数,并且创建两个线程来分别移动圆形标签和正方形标签。