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);//设置窗口可见!
    }

}

文章完

posted @ 2022-02-17 18:13  辰梦starDream  阅读(21)  评论(0编辑  收藏  举报  来源