java实现画图板功能
本文实例为大家分享了java实现画图板的具体代码,供大家参考,具体内容如下
画图板需要满足的功能有:
画线,画三角形,画矩形,画多边形,画曲线
设置不同颜色的画笔
改变窗口大小或最小化窗口后重新打开时图案不消失
画图方法的编写:
创建一个类,继承JPanel类,重写JPanel的绘制方法,重写方法时写上原有的绘制方法,再添加绘制已有的图形的方法。(为了在改变窗口大小和最小化窗口后再打开时图案不消失)
在画图方法中首先创建一个窗体,设置好各项参数后,将窗体设置边框布局。由于继承了JPanel类,重写的JPanel的绘制方法对于this生效,所以this为画图部分的面板,将this设置背景色为白色,添加到边框布局的中央。再创建一个面板对象(此面板对象用于存放按钮),设置一个背景色并放在边框布局的上方。
由于接下来的按钮和画图面板都需要监听器,于是创建Listener类。Listener类实现ActionListener,MouseListener,MouseMotionListener的接口。Listener类需要重写这些监听器接口的所有方法。
创建字符串数组存放画图形状的名称,接着使用for循环,将字符串添加到各个按钮上,再将按钮添加到面板对象中,最后再给按钮加上按钮监听器;接着再创建颜色类的数组存放各种颜色,同样使用for循环,将颜色设置成按钮的背景色,再将按钮添加到边框布局上方的面板对象中,再给按钮添加监听器。最后再在面板上获取画笔并添加上鼠标监听器。
packagedraw0924;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Graphics;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassdrawframeextendsJPanel{
publicstaticvoidmain(String[]args){
drawframedr=newdrawframe();
dr._draw();
}
privateShape[]shape;
publicvoid_draw(){
JFramejf=newJFrame();
jf.setSize(800,800);
jf.setTitle("画图窗口");
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
jf.setLayout(newBorderLayout());//设置边框布局
JPanelpanel=newJPanel();//创建一个面板对象
panel.setBackground(Color.GREEN);
jf.add(panel,BorderLayout.NORTH);//添加到边框布局的上方
Listenerbutt=newListener();//创建监听器类,并创建一个监听器对象
String[]str={"画线","画三角形","画矩形","画多边形","画曲线"};//创建字符串数组存储按钮文字
for(inti=0;i
监听器方法的重写:
首先是点击按钮监听方法的重写:获取按钮上的字符串,如果是空字符串则将监听器内的画笔颜色设置为按钮颜色,如果是绘图方法的字符串(用于以下的监听方法中判断执行绘画方法),并将全局变量i重置为0(在切换画图方法时可重置数据)。
画线方法:若字符串为画线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段。最后保存画图形状,x1,y1,x2,y2和画笔颜色的数据到Shape类中的shape数组。(Shape类在后面说明)。
画三角形方法:若字符串为画三角形,且全局变量i=0(判断是否为画三角形的第一步),则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时将i++(避免之后的点击动作重置x1,y1和x2,y2)。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,分别画出该点与线段两个端点的连线,再将i重置为0(为画下一个三角形做准备)。最后再保存图形的相应数据到shape数组。
画矩形方法:若字符串为画矩形,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画矩形方法,传入参数x1,x2中较小的数,y1,y2中较小的数(较小的数作为矩形的左上方点的坐标),x1-x2的绝对值(矩形长度),y1-y2的绝对值(矩形高度)。最后再保存图形的相应数据到shape数组。
画多边形方法:若字符串为画多边形,且全局变量i=0(判断是否为画多边形的第一步),则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段并保存这条线段的数据同时将i++(避免之后的点击动作重置x1,y1和x2,y2)。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,画出x2,y2与x3,y3的连线同时保存这条线段的数据,接着将x3,y3赋值给x2,y2(为画下一条连线做准备)。同时设置若双击则将此点和x1,y1连接并保存这条线段的数据,最后再将i重置为0(为画下一个多边形做准备)。
画曲线方法:若字符串为画曲线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1,再在鼠标拖拽方法中获取鼠标所在点的坐标x2,y2,并用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时保存这条线段的数据。再将x2,y2赋值给x1,y1。
最后再添加获取面板画笔的方法和返回shape数组的方法(在外部使用)。
packagedraw0924;
importjava.awt.Color;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjavax.swing.JButton;
publicclassListenerimplementsActionListener,MouseListener,MouseMotionListener{
privateGraphicsg;intx1,y1,x2,y2,x3,y3,i=0,j=0;Stringstr;Shape[]shape=newShape[10000];
publicShape[]get(){
returnshape;//返回保存的图形数组
}
publicvoidsetg(Graphicsg){
this.g=g;//获取外部画笔
}
publicvoidactionPerformed(ActionEvente){
if("".equals(e.getActionCommand())){
JButtonjb=(JButton)e.getSource();
Colorcolor=jb.getBackground();
g.setColor(color);//若为颜色按钮则设置画笔颜色
}
else{
str=e.getActionCommand();//若为绘画方法按钮则获取按钮上字符串
i=0;//切换绘画方法时重置数据
}
}
@Override
publicvoidmouseDragged(MouseEvente){
if(str=="画曲线"){
x2=e.getX();
y2=e.getY();
g.drawLine(x1,y1,x2,y2);
shape[j++]=newShape("画曲线",x1,y1,x2,y2,0,0,g.getColor());
x1=x2;
y1=y2;
}
}
@Override
publicvoidmouseMoved(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseClicked(MouseEvente){
if("画三角形"==str){
x3=e.getX();
y3=e.getY();
g.drawLine(x1,y1,x3,y3);
g.drawLine(x2,y2,x3,y3);
i=0;//为画下一个三角形做准备
shape[j++]=newShape("画三角形",x1,y1,x2,y2,x3,y3,g.getColor());
}
if("画多边形"==str){
x3=e.getX();
y3=e.getY();
g.drawLine(x3,y3,x2,y2);
shape[j++]=newShape("画多边形",x2,y2,x3,y3,0,0,g.getColor());
x2=x3;
y2=y3;
if(e.getClickCount()==2){
g.drawLine(x1,y1,x2,y2);
shape[j++]=newShape("画多边形",x1,y1,x2,y2,0,0,g.getColor());
i=0;//为画下一个多边形做准备
}
}
}
@Override
publicvoidmousePressed(MouseEvente){
if("画线"==str){
x1=e.getX();
y1=e.getY();
}
if("画三角形"==str){
//判断为画三角形的第一步
if(i==0){
x1=e.getX();
y1=e.getY();
}
}
if("画矩形"==str){
x1=e.getX();
y1=e.getY();
}
if("画多边形"==str){
//判断为画多边形的第一步
if(i==0){
x1=e.getX();
y1=e.getY();
}
}
if("画曲线"==str){
x1=e.getX();
y1=e.getY();
}
}
@Override
publicvoidmouseReleased(MouseEvente){
if("画线"==str){
x2=e.getX();
y2=e.getY();
g.drawLine(x1,y1,x2,y2);
shape[j++]=newShape("画线",x1,y1,x2,y2,0,0,g.getColor());
}
if("画三角形"==str){
//判断为画三角形的第一步
if(i==0){
x2=e.getX();
y2=e.getY();
g.drawLine(x1,y1,x2,y2);
i++;//避免在点击时重置已有的坐标值
}
}
if("画矩形"==str){
x2=e.getX();
y2=e.getY();
g.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));
shape[j++]=newShape("画矩形",x1,y1,x2,y2,0,0,g.getColor());
}
if("画多边形"==str){
//判断为画多边形的第一步
if(i==0){
x2=e.getX();
y2=e.getY();
g.drawLine(x1,y1,x2,y2);
i++;//避免在点击时重置已有的坐标值
shape[j++]=newShape("画多边形",x1,y1,x2,y2,0,0,g.getColor());
}
}
}
@Override
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
}
创建Shape类保存图形的形状,大小和颜色等各项数据。
packagedraw0924;
importjava.awt.Color;
importjava.awt.Graphics;
publicclassShape{
privateStringname;
privateintx1,y1,x2,y2,x3,y3;
privateColorm;
publicShape(Stringname,intx1,inty1,intx2,inty2,intx3,inty3,Colorm){
this.name=name;
this.x1=x1;
this.x2=x2;
this.y1=y1;
this.y2=y2;
this.x3=x3;
this.y3=y3;
this.m=m;
}
publicvoiddrawshape(Graphicsg){
g.setColor(m);
switch(name){
case"画线":
g.drawLine(x1,y1,x2,y2);
break;
case"画三角形":
g.drawLine(x1,y1,x2,y2);
g.drawLine(x1,y1,x3,y3);
g.drawLine(x3,y3,x2,y2);
break;
case"画矩形":
g.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));
break;
case"画多边形":
g.drawLine(x1,y1,x2,y2);
break;
case"画曲线":
g.drawLine(x1,y1,x2,y2);
break;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。