1 开发一个基于GUI的动态显示任意曲线系统 2在GUI界面上演示一个自左至右移动的曲线 。 3曲线在移动过程中,同时也显示当前曲线对应的y值。 4曲线的x数据用计算机模拟。 5采用技术:GUI,图形,线程, 泛型同步技术。
时间: 2024-03-11 17:46:01 浏览: 70
好的,那么让我们开始吧。首先,我们需要创建一个Java项目,并添加Swing库来实现GUI界面的开发。
接下来,我们需要创建一个继承自JPanel的类,用于绘制曲线。该类需要实现Runnable接口,以便可在单独的线程中运行。
在该类中,我们需要重写paintComponent方法,以便在该方法中绘制曲线。曲线的x数据可以使用Math类的sin方法来模拟,y数据可以使用随机数来生成。
为了实现自左至右移动的曲线,我们可以使用一个计时器,每隔一段时间重新绘制曲线,并且在每次绘制时将曲线的x坐标向右移动一定的距离。
同时,我们需要在GUI界面中添加一个文本框,用于显示当前曲线对应的y值。我们可以在绘制曲线时,获取当前鼠标所在位置的y值,并将其显示在文本框中。
为了保证线程安全,我们可以使用同步技术来避免多个线程同时访问共享资源的情况。
下面是一个简单的实现代码,你可以参考一下:
```java
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class CurvePanel extends JPanel implements Runnable {
private static final int WIDTH = 500;
private static final int HEIGHT = 300;
private static final int SPEED = 5; // 曲线移动速度
private static final int INTERVAL = 50; // 重绘间隔时间
private int x; // 曲线的x坐标
private int y; // 曲线的y坐标
private int yValue; // 当前曲线对应的y值
private Random random = new Random();
private Timer timer; // 计时器
private JTextArea textArea; // 显示当前y值的文本框
public CurvePanel(JTextArea textArea) {
this.textArea = textArea;
x = 0;
y = HEIGHT / 2;
timer = new Timer(INTERVAL, e -> {
x += SPEED;
if (x > WIDTH) {
x = 0;
}
updateYValue();
repaint();
});
timer.start();
}
private void updateYValue() {
yValue = random.nextInt(HEIGHT);
textArea.setText("y = " + yValue);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制曲线
g.setColor(Color.RED);
for (int i = 0; i < WIDTH; i++) {
int y = (int) (HEIGHT / 2 + 50 * Math.sin((i + x) * 0.1));
g.drawLine(i, this.y, i + 1, y);
this.y = y;
}
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(INTERVAL);
} catch (InterruptedException e) {
e.printStackTrace();
}
x += SPEED;
if (x > WIDTH) {
x = 0;
}
updateYValue();
repaint();
}
}
}
```
在主程序中,我们可以创建一个JFrame窗口,并在其中添加上述自定义的JPanel组件和一个JTextArea组件,用于显示当前曲线对应的y值。
```java
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
public MainFrame() {
setTitle("Curve Demo");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea = new JTextArea(1, 10);
textArea.setEditable(false);
CurvePanel curvePanel = new CurvePanel(textArea);
curvePanel.setPreferredSize(new Dimension(CurvePanel.WIDTH, CurvePanel.HEIGHT));
add(curvePanel, BorderLayout.CENTER);
add(textArea, BorderLayout.SOUTH);
}
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true);
}
}
```
这样,一个基于GUI的动态显示任意曲线系统就完成了。
阅读全文