📄 analyzepan.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.Line2D;
import java.util.Vector;
public class AnalyzePan extends JPanel implements ComponentListener,Runnable
{
private Thread thread;
private DFT dft;
private int n;
private Vector lines=new Vector();
public AnalyzePan(int[] data,int n)
{
this.n=n;
dft=new DFT(data,n);
addComponentListener(this);
}
public AnalyzePan(){}
//获得被采样数据
public void setSampleData(int[] data)
{
dft.setSampleData(data);
}
//设置采样数
public void setSampleNumber(int n)
{
dft.setSampleNumber(n);
}
//进行DFT运算并将其曲线写入Vector容器内
public void createWaveForm()
{
//获得JPanel的高和宽
Dimension d = getSize();
int w = d.width;
int h = d.height;
//lines里保存着每次根据采样点值画的连续曲线
//所以要先清空,以便以后载入新的连续曲线
lines.removeAllElements();
double[] dftData=dft.getDFT();
double max=0;
//获取运算数据最大值
for(int i=0;i<dftData.length;i++)
{
if(dftData[i]>max)max=dftData[i];
}
//声明画线坐标
double x_new=0,x_old=0,y_new=0,y_old=0;
//将DFT数据转换为曲线,并存入Vector容器内
for(int i=0;i<dftData.length;i++)
{
x_new=(double)i/dftData.length*w;
y_new=h*(dftData[i]/max);
lines.add(new Line2D.Double(x_old,y_old,x_new,y_new));
y_old=y_new;
x_old=x_new;
}
repaint();
}
public void paint(Graphics g)
{
Dimension d = getSize();
int w = d.width;
int h = d.height;
//清屏
Graphics2D g2 = (Graphics2D) g;
g2.setBackground(Color.black);
g2.clearRect(0, 0, w, h);
//画十字格
for(int i=0;i<10;i++)
{
Shape l=new Line2D.Float(w/10*i,0,w/10*i,h);
g2.setColor(Color.GRAY);
g2.draw(l);
l=new Line2D.Float(0,h/10*i,w,h/10*i);
g2.draw(l);
}
//画频谱分析曲线
g2.setColor(Color.CYAN);
if(dft != null)
{
for (int i = 1; i < lines.size(); i++)
{
g2.draw((Line2D) lines.get(i));
}
}
}
public void start()
{
thread = new Thread(this);
thread.setName("AnalyzePan");
thread.start();
}
public void stop()
{
if (thread != null)
{
thread.interrupt();
}
thread = null;
}
public void run()
{
while (thread != null)
{
try { thread.sleep(100); } catch (Exception e) { break; }
repaint();
}
}
//实现当Panle大小改变时,里面内容自动重绘
public void componentResized(ComponentEvent e)
{
createWaveForm();
}
public void componentMoved(ComponentEvent e){}
public void componentShown(ComponentEvent e){}
public void componentHidden(ComponentEvent e){}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -