图画板系列之扩展按钮键功能

扩展按钮功能步骤

  1. 设置窗体布局
  2. 创建一个字符串数组用来放按钮功能内容
  3. 循环遍历数组   创建按钮对象(用的for循环嗷)
  4. 增加动作监听器(按按钮是一个动作)
  5. 实现动作监听器的方法(用Java自带的函数放这个方法)
  6. 创建一个字符串用来获取按键的文本
  7. 将MousListener监听对象放到方法的外面  整个类都可以使用这个对象
  8. 给按钮加上监听器
  9. 设置一个全局变量 用于判断图形
  10. 获取文本   赋值给全局变量type
  11. 根据type的值   判断所需要绘制的图形是哪个(用的if(type.equals(“直线”){   }else if(){})

扩展按钮功能代码展示

package drawpad;

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

public class DrawPad {
    //7、将监听器对象移到方法外面 整个类都可以使用这个对象
    DrawLister dl=new DrawLister();
    //创建一个新的函数用来写方法
    public void showUI(){
        JFrame jf=new JFrame();
        jf.setTitle("画板1.0") ;//标题
        jf.setSize(800,600);//尺寸
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭方式
        jf.setLocation(500,200);//位置
        jf.setVisible(true);//可视化
        //增加按钮 用于选择图形
        //1、设置窗体布局
        jf.setLayout(new FlowLayout());//流式布局
        //创建一个字符串数组
        String[] btnStrs={"直线","矩形","圆形","实心矩形","实心圆形","五角星","立方体","小白旗","等腰三角形" };

                for (int i=0;i< btnStrs.length;i++){
                    JButton btn=new JButton();
                    btn.setText(btnStrs[i]);
                    jf.add(btn);
                    //8、给按钮都按上监听器
                    btn.addActionListener(dl);

                }

      //  DrawLister dl=new DrawLister();
        jf.addMouseListener(dl);//添加鼠标监听器 给窗体

        //获得Graphics
        Graphics g= jf.getGraphics();
        //传Graphics画笔,监听器中的方法才可以使用画笔绘制图形
        dl.g=g;

    }
//主函数  用来调用新函数里面的方法
    public static void main(String[] args) {
        DrawPad drawPad=new DrawPad();
        drawPad.showUI();
    }
}
package drawpad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
//4、增加动作监听器
public class DrawLister implements MouseListener, ActionListener {
    Graphics g=null;
    int x1 ,y1,x2,y2;
    //9、设置一个全局变量 用于判断图形
    String type="";

    //5、实现动作监听器的方法
    @Override
    public void actionPerformed(ActionEvent e) {
      //6、获得按钮的文本
        String ac=e.getActionCommand();
        System.out.println(ac);
        //10、获取文本 赋值给全局变量type
        type=ac;

    }
    @Override
    public void mouseClicked(MouseEvent e) {
        int x=e.getX();
        int y=e.getY();
        System.out.println("点击:x"+x +"y:"+y);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int x=e.getX();
        int y=e.getY();
        System.out.println("按下:x"+ x +"y:"+y);
         x1=x;
         y1=y;

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    int x=e.getX();
    int y=e.getY();
         x2=x;
         y2=y;
         //11、根据type的值判断所需要绘制的图像
        if (type.equals("直线")){
            g.drawLine(x1,y1,x2,y2);
        } else if (type.equals("矩形")) {
            g.drawLine(x1,y1,x2,y1);
            g.drawLine(x1,y1,x1,y2);
            g.drawLine(x1,y2,x2,y2);
            g.drawLine(x2,y2,x2,y1);


        } else if (type.equals("圆形")) {
            //圆的外切矩形左上角的坐标    宽     高
            g.drawOval(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x2-x1),Math.abs(y2-y1));

        } else if (type.equals("实心矩形")) {
            //圆的外切矩形左上角的坐标    宽     高

            g.fillOval(x1,y1,x2,y1);
            g.fillOval(x1,y1,x1,y2);
            g.fillOval(x1,y2,x2,y2);
            g.fillOval(x2,y2,x2,y1);

        } else if (type.equals("实心圆形")) {
            g.fillOval(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x2-x1),Math.abs(y2-y1));

        } else if (type.equals("五角星")) {
            g.drawLine(x1,y2,x2,(y1+y2)/2);
            g.drawLine(x1,y2,(x1+x2)/2,y1);
            g.drawLine(x2,y2,x1,(y1+y2)/2);
            g.drawLine(x2,y2,(x1+x2)/2,y1);
            g.drawLine(x1,(y1+y2)/2,x2,(y1+y2)/2);


        } else if (type.equals("立方体")) {
            g.drawLine(x1,y1,x2,y1);
            g.drawLine(x1,y1,x1,y2);
            g.drawLine(x1,y2,x2,y2);
            g.drawLine(x2,y2,x2,y1);
            g.drawLine(x1*3/2,y1*3/2,x1,y1);
            g.drawLine(x2*3/2,y1*3/2,x2,y1);
            g.drawLine(x1*3/2,y2*3/2,x1,y2);
            g.drawLine(x2*3/2,y2*3/2,x2,y2);
            g.drawLine(x1*3/2,y1*3/2,x2*3/2,y1*3/2);
            g.drawLine(x1*3/2,y1*3/2,x1*3/2,y2*3/2);
            g.drawLine(x1*3/2,y2*3/2,x2*3/2,y2*3/2);
            g.drawLine(x2*3/2,y2*3/2,x2*3/2,y1*3/2);


        } else if (type.equals("小白旗")) {
            g.drawLine(x1,(y1+y2)*1/3,(x1+x2)/2,y1);
            g.drawLine(x1,(y1+y2)*1/3,(x1+x2)/3,y2);
            g.drawLine((x1+x2)/2,y1,(x1+x2)/3,y2);
            g.drawLine(x1,(y1+y2)*2/3,(x1+x2)/2,y2);
            g.drawLine(x1,(y1+y2)*2/3,x2,(y1+y2)*2/3);
            g.drawLine((x1+x2)/2,y2,x2,(y1+y2)*2/3);


        }





    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }


}

知识点增加

  • Math.min是指两个数比较的最小值
  • Math.abs是指绝对值的意思
  • 里面的圆形可能是正圆也可能是椭圆所以利用圆的外切矩形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值