java 实现正弦曲线(模仿、练习Java swing)
演示内容
本章代码:主要用来显示正弦曲线!
本章所选语言:Java
本章采用集成开发环境:IDEA
本章创作来源:阿发你好–视频讲解java Swing基础
本章最终成果,如下图所示:
框架类
package com.test2;
/*
自定义布局管理器
1.自定义一个类(如:myLayoutMannage),并实现LayoutMannage接口
2.重写自定义布局管理器类的方法
3.在框架中设置布局管理器时,使用该布局管理器!
*/
import com.test1.LayoutAdapter;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class MyFrame2 extends JFrame {
public MyFrame2(){
super();
}
public MyFrame2(String title){
super(title);//利用父类方法进行设置框架名称
JPanel root = new JPanel();
this.setContentPane(root);
root.setLayout(new MyLayoutManage());
//添加自定义组件
MyControl2 control1 = new MyControl2();
//设置组件大小
control1.setPreferredSize(new Dimension(Demo2.screenWide, Demo2.screeHeight));
//容器添加组件
root.add(control1);
}
//内部类:自定义一个布局管理器
private class MyLayoutManage extends LayoutAdapter {
List<Component> list = new ArrayList<>();
@Override
public void addLayoutComponent(Component comp, Object constraints) {
list.add(comp);
}
@Override
public void removeLayoutComponent(Component comp) {
list.add(comp);
}
@Override
public void layoutContainer(Container parent) {
int width = parent.getWidth();
int height = parent.getHeight();
//设置第一个添加进容器的组件
Component component1 = list.get(0);
component1.setLocation(0,0);
component1.setSize(component1.getPreferredSize().width,component1.getPreferredSize().height);
}
}
}
自定义控件
package com.test2;
/*
画正弦曲线
*/
import javax.swing.*;
import java.awt.*;
public class MyControl2 extends JPanel {
//关于正弦曲线的相关的属性
private int amplitude = 150;//振幅
private int period = 200;//周期
private int accuracy = 3;//精度(PS:关于曲线,只能求近似!精度指的是两个点之间的横向跨度)
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);//要保留父类方法
int width = this.getWidth();//设置自定义控件的宽度
int height = this.getHeight();//设置自定义控件的高度
//背景设置:先画出背景,接着在背景的基础上画出各种几何图形!
g.setColor(new Color(255,255,255));
g.fillRect(0,0,width,height);
//画正弦弦曲 --->基准线(中线)
int center = height/2;
g.setColor(new Color(0, 0,0, 255));
g.drawLine(0,center,width,center);
g.drawString("正弦曲线图",20,center - amplitude - 80);
//画正弦曲线 --->近似曲线
g.setColor(new Color(9, 9, 211));
int x1 = 0;
int y1 = 0;
for(int i = 0;i < width;i += accuracy){
int x2 = i;//确定下一个点的横坐标
//接着只需确定下一个点的纵坐标,即可画一条线
double wx = -2 * Math.PI * x2 / period;
//根据y = A sin(wx);公式即可求解
int y2 = (int) (amplitude * Math.sin(wx));
//求出下一点的坐标后,画出线即可
g.drawLine(x1,y1+center,x2,y2+center);
//画完线之后,继续找下一点的坐标
x1 = x2;
y1 = y2;
}
}
}
主方法
package com.test2;
import javax.swing.*;
public class Demo2 {
public static int screenWide = 800;//屏幕宽度
public static int screeHeight = 600;//屏幕高度
public static void main(String[] args) {
MyFrame2 frame = new MyFrame2("测试窗口");
frame.setSize(screenWide,screeHeight);//设置大小
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//启动窗口关闭按钮
frame.setLocationRelativeTo(null);//处于屏幕中间
frame.setResizable(false);//设置屏幕框架不可自由缩放
frame.setVisible(true);//设置窗口可见!
}
}