扩展按钮功能步骤
- 设置窗体布局
- 创建一个字符串数组用来放按钮功能内容
- 循环遍历数组 创建按钮对象(用的for循环嗷)
- 增加动作监听器(按按钮是一个动作)
- 实现动作监听器的方法(用Java自带的函数放这个方法)
- 创建一个字符串用来获取按键的文本
- 将MousListener监听对象放到方法的外面 整个类都可以使用这个对象
- 给按钮加上监听器
- 设置一个全局变量 用于判断图形
- 获取文本 赋值给全局变量type
- 根据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是指绝对值的意思
- 里面的圆形可能是正圆也可能是椭圆所以利用圆的外切矩形