可以给我展示相应代码吗
时间: 2024-03-07 17:53:54 浏览: 16
当然可以,以下是一个示例代码:
```java
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CurveComponent extends JComponent {
private double[] xData;
private double[] yData;
private double xmin, xmax, ymin, ymax;
public CurveComponent(double[] xData, double[] yData) {
this.xData = xData;
this.yData = yData;
xmin = xmax = xData[0];
ymin = ymax = yData[0];
for (int i = 1; i < xData.length; i++) {
xmin = Math.min(xmin, xData[i]);
xmax = Math.max(xmax, xData[i]);
ymin = Math.min(ymin, yData[i]);
ymax = Math.max(ymax, yData[i]);
}
}
public void setXData(double[] xData) {
this.xData = xData;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
g2.setPaint(Color.RED);
Path2D path = new Path2D.Double();
double xScale = getWidth() / (xmax - xmin);
double yScale = getHeight() / (ymax - ymin);
for (int i = 0; i < xData.length; i++) {
double x = (xData[i] - xmin) * xScale;
double y = getHeight() - (yData[i] - ymin) * yScale;
if (i == 0) {
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
g2.draw(path);
}
}
public class CurveFrame extends JFrame {
private CurveComponent curveComponent;
private JLabel yLabel;
public CurveFrame() {
setTitle("Curve Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
double[] xData = new double[100];
double[] yData = new double[100];
for (int i = 0; i < 100; i++) {
xData[i] = i;
yData[i] = Math.sin(i * 0.1);
}
curveComponent = new CurveComponent(xData, yData);
panel.add(curveComponent, BorderLayout.CENTER);
yLabel = new JLabel("y = ");
panel.add(yLabel, BorderLayout.SOUTH);
setContentPane(panel);
pack();
}
public void start() {
Thread thread = new Thread(() -> {
double[] xData = curveComponent.xData;
double[] yData = curveComponent.yData;
for (int i = 0; i < xData.length; i++) {
xData[i] += 1;
yData[i] = Math.sin(xData[i] * 0.1);
SwingUtilities.invokeLater(() -> {
curveComponent.repaint();
yLabel.setText("y = " + yData[i]);
});
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
break;
}
}
});
thread.start();
}
public static void main(String[] args) {
CurveFrame frame = new CurveFrame();
frame.setVisible(true);
frame.start();
}
}
```
该代码实现了一个动态显示正弦曲线的GUI应用程序。CurveComponent类继承自JComponent,并重写了paintComponent方法用于绘制曲线。在CurveFrame类中,使用CurveComponent类创建了一个面板用于显示曲线,同时添加了一个JLabel显示当前曲线对应的y值。在start方法中启动了一个线程,用于控制曲线的移动和更新y值。在线程中,使用SwingUtilities.invokeLater方法更新GUI界面,保证线程安全。