请设计一个java多线程应用程序,实现两个标签在窗口上移动,一个按照圆形轨迹移动,一个按照正方形轨迹移动,移动的半径、边长、初始位置等参数需要在窗口中输入,即参数可调
时间: 2024-03-23 08:40:57 浏览: 13
好的,这是一个简单的Java多线程应用程序,实现两个标签在窗口上移动,一个按照圆形轨迹移动,一个按照正方形轨迹移动。移动的半径、边长、初始位置等参数需要在窗口中输入,即参数可调。
```java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CircleSquareMovement extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private static final int WINDOW_WIDTH = 600;
private static final int WINDOW_HEIGHT = 600;
private static final int LABEL_WIDTH = 50;
private static final int LABEL_HEIGHT = 50;
private static final int CIRCLE_SPEED = 5;
private static final int SQUARE_SPEED = 10;
private static final Color CIRCLE_COLOR = Color.RED;
private static final Color SQUARE_COLOR = Color.BLUE;
private JTextField radiusField;
private JTextField squareSizeField;
private JTextField circleXField;
private JTextField circleYField;
private JTextField squareXField;
private JTextField squareYField;
private JButton startButton;
private JLabel circleLabel;
private JLabel squareLabel;
private List<Point> circlePoints;
private List<Point> squarePoints;
private Thread circleThread;
private Thread squareThread;
private boolean running;
public CircleSquareMovement() {
setTitle("Circle and Square Movement");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
add(panel);
JLabel radiusLabel = new JLabel("Radius:");
panel.add(radiusLabel);
radiusField = new JTextField(5);
panel.add(radiusField);
JLabel squareSizeLabel = new JLabel("Square Size:");
panel.add(squareSizeLabel);
squareSizeField = new JTextField(5);
panel.add(squareSizeField);
JLabel circleXLabel = new JLabel("Circle X:");
panel.add(circleXLabel);
circleXField = new JTextField(5);
panel.add(circleXField);
JLabel circleYLabel = new JLabel("Circle Y:");
panel.add(circleYLabel);
circleYField = new JTextField(5);
panel.add(circleYField);
JLabel squareXLabel = new JLabel("Square X:");
panel.add(squareXLabel);
squareXField = new JTextField(5);
panel.add(squareXField);
JLabel squareYLabel = new JLabel("Square Y:");
panel.add(squareYLabel);
squareYField = new JTextField(5);
panel.add(squareYField);
startButton = new JButton("Start");
startButton.addActionListener(this);
panel.add(startButton);
circleLabel = new JLabel();
circleLabel.setSize(LABEL_WIDTH, LABEL_HEIGHT);
circleLabel.setOpaque(true);
circleLabel.setBackground(CIRCLE_COLOR);
panel.add(circleLabel);
squareLabel = new JLabel();
squareLabel.setSize(LABEL_WIDTH, LABEL_HEIGHT);
squareLabel.setOpaque(true);
squareLabel.setBackground(SQUARE_COLOR);
panel.add(squareLabel);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
int radius = Integer.parseInt(radiusField.getText());
int squareSize = Integer.parseInt(squareSizeField.getText());
int circleX = Integer.parseInt(circleXField.getText());
int circleY = Integer.parseInt(circleYField.getText());
int squareX = Integer.parseInt(squareXField.getText());
int squareY = Integer.parseInt(squareYField.getText());
circlePoints = generateCirclePoints(radius, circleX, circleY);
squarePoints = generateSquarePoints(squareSize, squareX, squareY);
running = true;
circleThread = new Thread(new CircleMovement());
squareThread = new Thread(new SquareMovement());
circleThread.start();
squareThread.start();
}
}
private List<Point> generateCirclePoints(int radius, int centerX, int centerY) {
List<Point> points = new ArrayList<>();
for (int i = 0; i < 360; i++) {
double angle = Math.toRadians(i);
int x = (int) (centerX + radius * Math.cos(angle));
int y = (int) (centerY + radius * Math.sin(angle));
points.add(new Point(x, y));
}
return points;
}
private List<Point> generateSquarePoints(int size, int centerX, int centerY) {
List<Point> points = new ArrayList<>();
points.add(new Point(centerX - size / 2, centerY - size / 2));
points.add(new Point(centerX + size / 2, centerY - size / 2));
points.add(new Point(centerX + size / 2, centerY + size / 2));
points.add(new Point(centerX - size / 2, centerY + size / 2));
return points;
}
private void moveCircle() {
Point point = circlePoints.get(0);
circlePoints.remove(0);
circlePoints.add(point);
circleLabel.setLocation(point);
}
private void moveSquare() {
Point point = squarePoints.get(0);
squarePoints.remove(0);
squarePoints.add(point);
squareLabel.setLocation(point);
}
private class CircleMovement implements Runnable {
@Override
public void run() {
while (running) {
try {
Thread.sleep(CIRCLE_SPEED);
moveCircle();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private class SquareMovement implements Runnable {
@Override
public void run() {
while (running) {
try {
Thread.sleep(SQUARE_SPEED);
moveSquare();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new CircleSquareMovement();
}
}
```
在这个程序中,我们使用了Java Swing来创建一个窗口,并在窗口中添加了一些文本框、标签和按钮。文本框用于输入半径、边长和初始位置等参数,按钮用于启动运动。
我们使用两个线程分别控制圆形标签和正方形标签的移动。每个线程都有一个循环,每次循环线程都会暂停一段时间,然后移动标签到下一个位置。圆形标签的下一个位置是圆形轨迹上的下一个点,正方形标签的下一个位置是正方形轨迹上的下一个点。
在每个线程中,我们使用了 `Thread.sleep()` 方法来暂停线程,以便标签有足够的时间移动到下一个点。我们还实现了 `generateCirclePoints()` 和 `generateSquarePoints()` 方法来生成圆形轨迹和正方形轨迹上的点列表。
最后,我们还实现了 `moveCircle()` 和 `moveSquare()` 方法来移动圆形标签和正方形标签到下一个位置。在这些方法中,我们从点列表中获取下一个点,并将标签移动到该点的位置。
此程序可以让你在窗口中输入参数,然后启动两个标签的运动。圆形标签将沿着圆形轨迹移动,而正方形标签将沿着正方形轨迹移动。