Java学习笔记(三)——图形绘制

UI —— JFrame 类

思路

设计一个自己的UI类。

  • 有界面初始化函数。
  • 有运行函数,生成一个UI对象,执行初始化方法。

初始化函数如何设计

用到JFrame类创建窗体(窗口)。

  • 界面设计
  • 监听事件——触发功能

界面设计

JFrame jf = new JFrame("窗体的名字");                //创建一个JFrame对象
jf.setSize(1000,800);                               //窗体的大小
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //默认关闭退出,直接退出进程
jf.setVisible(true);                                //设置可视化硬件配置(显卡)
//还有很多其他的设置方法

监听事件——触发功能

myListener mylis = new myListener(); //定义一个监听器对象,这个监听器是自己写的方法,是继承的MouseListener接口
jf.addMouseListener(mylis);          //让自己的界面将这个监听器功能加进去

Listener 监听器 —— MouseListener接口

监听器是个啥,能干什么?

  • 监听到用户在界面上的操作,例如你鼠标的点击,按压,释放。
  • 得知按钮(鼠标的按键)在窗体上操作得到的数据,例如鼠标点击的坐标、左键还有右键点击、点击的时间。

思路

设计一个myListener类,这个类继承的是MouseListener接口,所以MouseListener里面所有的方法都需要被重写,也就是让你自己决定监听到的这些操作应该执行什么程序。

如何设计类来继承MouseListener接口

  • 重写接口的所有方法。
  • 自己设计一些函数实现想实现的功能。

重写方法(必须是所有方法都要写,接口特性规定的)

public class byListener implements MouseListener {    
    int x1,y1,x2,y2,x,y;                         //可以全局也可以是局部变量
    Graphics mypen;                              //定义画笔
    @Override
    public void mouseClicked(MouseEvent e) {     //鼠标点击        //每个方法的传参是一个事件对象,事件是一个子类,捕获监视器监听到的数据(包括坐标、事件、左右按键等等)
        x = e.getX();                            //得到点击位置坐标
        y = e.getY();
        System.out.println("click!");            //在运行框输出文字
        //除了获得坐标还可以实现得到位置、时间等等(对象提示里面可以看的到全部e对象可调用的方法)
    }

    @Override
    public void mousePressed(MouseEvent e) {     //鼠标按压
        x1 = e.getX();
        y1 = e.getY();
        System.out.println("press!");
    }

    @Override
    public void mouseReleased(MouseEvent e) {    //鼠标释放
        x2 = e.getX();
        y2 = e.getY();
        System.out.println("release!");
    }

    @Override
    public void mouseEntered(MouseEvent e) {     //鼠标进入界面
        System.out.println("In");
    }

    @Override
    public void mouseExited(MouseEvent e) {      //鼠标离开界面
        System.out.println("Out");
    }

    //MouseListener接口只有这么多方法
}

自己设计函数

//画折线函数
    Random random_num = new Random();
    public void drawKLine(int x1,int y1,int x2,int y2,int range){   //实现一个画折线函数:折线实现方式:每次找一个线段中点,当线段中点距离左边(右边)端点小于3的时候就将这个点与左边(右边端点)连接起来。用递归的方法实现。
        if(Math.abs(x2-x1)<3){             //结束条件                        
            mypen.drawLine(x1,y1,x2,y2);   //调用画笔的连线方法
            return;                        
        }
        int cx = (x1+x2)/2;                //找中点坐标
        int cy = (y1+y2)/2;
        range *=0.7;                       //中点的y坐标要上下偏移,但是偏移的界限有限
        cy+= random_num.nextInt(range)-(range/2);  //在这个界限里面生成随机偏移值
        drawKLine(x1,y1,cx,cy,range);      //递归这个方法
        drawKLine(cx,cy,x2,y2,range);
    }

Graphics 

画笔类Graphics。定义画笔对象,需要从界面函数的getGraphics()方法获得。

 Graphics pen = jf.getGraphics();

画笔对象可以调用很多方法,例如画线函数drawLine();然后这个方法可以用在监听器的方法里面。(监听器类里面没有界面函数,可以先定义画笔对象<作为监听器函数的属性成员>,方法内使用。在UI要通过界面的getGraphics()函数获得一个画笔对象,并将这个对象赋值给监听器的画笔成员,赋值的时机必须要在监听器方法使用到这个画笔之前)

 mypen.drawLine(x1,y1,x2,y2);

 练习

//实现画一条线,在这个线段之间生成一段折线图
//byUI.java

import javax.swing.*;
import java.awt.*;

public class byUI {
    public void initUI(){
        JFrame jf = new JFrame("沪深K线图");
        jf.setSize(1000,800);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);

        Graphics pen = jf.getGraphics();
        byListener mylis = new byListener();
        mylis.mypen=pen;
        jf.addMouseListener(mylis);
    }
    public static void main (String[] args){
        byUI myui = new byUI();
        myui.initUI();
    }
}


//byListener.java

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class byListener implements MouseListener {
    int x1,y1,x2,y2,x,y;
    Graphics mypen;
    @Override
    public void mouseClicked(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        System.out.println("click!");

    }

    @Override
    public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();
        System.out.println("press!");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        x2 = e.getX();
        y2 = e.getY();
        System.out.println("release!");
        mypen.drawLine(x1,y1,x2,y2);
        drawKLine(x1,y1,x2,y2,500);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("In");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("Out");
    }
   
    //画折线函数
    Random random_num = new Random();
    public void drawKLine(int x1,int y1,int x2,int y2,int range){
        if(Math.abs(x2-x1)<3){
            mypen.drawLine(x1,y1,x2,y2);
            return;
        }
        int cx = (x1+x2)/2;
        int cy = (y1+y2)/2;
        range *=0.7;
        cy+= random_num.nextInt(range)-(range/2);
        drawKLine(x1,y1,cx,cy,range);
        drawKLine(cx,cy,x2,y2,range);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值