运维开发网

实现java画板的功能

运维开发网 https://www.qedev.com 2022-05-06 16:11 出处:网络
这篇文章主要为大家详细介绍了java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文分享java画板的具体代码,供大家参考。具体内容如下

绘图板需要满足以下功能:

绘制线条、三角形、矩形、多边形、曲线
设置不同颜色的画笔
更改窗口大小或最小化窗口,图案在重新打开时不会消失。

制图方法的编制:

创建一个类,继承JPanel类,重写JPanel的画图方法,重写方法时写原画图方法,然后添加绘制已有图形的方法。(为了在改变窗口大小和最小化窗口后再次打开窗口时图案不会消失)

在绘制方法中,首先创建一个表单,设置好所有参数后,设置表单的边框布局。继承JPanel类,JPanel重写的画图方法为此生效,所以这是画图部分的面板。将此的背景色设置为白色,并将其添加到边框布局的中心。创建另一个面板对象(该面板对象用于存储按钮),设置一个背景颜色,并将其放置在边框布局上方。

因为下一个按钮和绘图面板需要侦听器,所以创建了侦听器类。Listener类实现ActionListener、MouseListener和MouseMotionListener的接口。监听器类需要覆盖这些监听器接口的所有方法。

创建一个字符串数组存储绘图形状的名称,然后用for循环给每个按钮添加字符串,再给panel对象添加按钮,最后给按钮添加按钮监听器;然后创建一个color类的数组来存储各种颜色,并使用for循环将颜色设置为按钮的背景色,然后将按钮添加到边框布局上方的panel对象中,再将侦听器添加到按钮中。最后,获得面板上的画笔,并添加鼠标显示器。

package draw0924;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class drawframe extends JPanel{public static void main(String[] args) { drawframe dr=new drawframe(); dr._draw();}private Shape[] shape;public void _draw() { JFrame jf=new JFrame(); jf.setSize(800,800); jf.setTitle("画图窗口"); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); jf.setLayout(new BorderLayout());//设置边框布局 JPanel panel=new JPanel();//创建一个面板对象 panel.setBackground(Color.GREEN); jf.add(panel,BorderLayout.NORTH);//添加到边框布局的上方 Listener butt=new Listener();//创建监听器类,并创建一个监听器对象 String[] str= {"画线","画三角形","画矩形","画多边形","画曲线"};//创建字符串数组存储按钮文字 for(int i=0;ilt;str.length;i++) { JButton jbu=new JButton(str[i]);//创建按钮对象并把按钮文字添加上 panel.add(jbu);//将按钮添加到面板对象上 jbu.addActionListener(butt);//给按钮添加监听器 } Color[] color= {Color.RED,Color.BLUE,new Color(104,150,144)};//创建颜色数组存储画笔颜色 for(int i=0;ilt;color.length;i++) { JButton jbu=new JButton();//创建按钮对象 jbu.setBackground(color[i]);//将按钮背景设置颜色 panel.add(jbu);//将按钮添加到面板对象上 jbu.setPreferredSize(new Dimension(30,30));//设置按钮大小 jbu.addActionListener(butt);//给按钮添加监听器 } this.setBackground(Color.WHITE);//将继承来的面板设置背景色 jf.add(this,BorderLayout.CENTER);//将此面板添加到边框布局的中央 jf.setVisible(true); Graphics g=this.getGraphics();//在要绘画的面板上获取画笔(要在窗口可视化之后) butt.setg(g);//将画笔传入监听器 this.addMouseListener(butt);//给要绘画的面板添加鼠标监听器 this.addMouseMotionListener(butt);//给要绘制的面板添加鼠标监听器 shape=butt.get();//将监听器内保存的图形保存到此类的全局变量中}public void paint(Graphics g) { super.paint(g);//父类的绘画方法 for(int i=0;ilt;shape.length;i++) { if(shape[i]!=null) { shape[i].drawshape(g);//图形的绘画 } }}}

侦听器方法的覆盖:

首先,点击按钮重写监视器方法:获取按钮上的字符串,如果是空字符串,将监视器中的画笔颜色设置为按钮颜色,如果是一串绘制方法(在下面的监视方法中用来判断绘制方法的执行),将全局变量I重置为0(切换绘制方法时可以重置数据)。

画线法:如果字符串是画线,鼠标按下的坐标点X和Y在鼠标按下监控法中获取,赋给全局变量x1和Y1;在鼠标释放监控方法中,获得鼠标释放的坐标点x和y,并将其分配给全局变量x2和y2。然后用brush对象调用画线方法,传入参数x1,y1,x2,y2来画线段。最后,将绘制形状、x1、y1、x2、y2和画笔颜色的数据保存到shape类中的shape数组中。(Shape类稍后描述)。

三角形绘制方法:如果字符串是三角形绘制,全局变量i=0(判断是否是三角形绘制的第一步),在鼠标按压监控方法中获取鼠标按压的坐标点X和Y,赋给全局变量x1和Y1;在鼠标释放监控方法中,获得鼠标释放的坐标点x和y,并将其分配给全局变量x2和y2。然后用brush对象调用画线方法,将参数x1,y1,x2,y2传入画出的线段,重置i++(避免点击后重置x1,y1和x2,y2)。然后,在鼠标点击方法中,获得鼠标点击的坐标点X和Y,并将其赋给全局变量x3和y3。然后由brush对象调用画线方法,分别画出该点与线段两端点的连线,然后将I复位为0(为画下一个三角形做准备)。最后,将图形的相应数据保存到形状数组中。

画矩形法:如果字符串是画矩形,鼠标按压的坐标点X,Y在鼠标按压监控法中获取,赋给全局变量x1,Y1;在鼠标释放监控方法中,获得鼠标释放的坐标点x和y,并将其分配给全局变量x2和y2。然后用brush对象调用矩形绘制方法,传入参数x1和x2中较小的数,参数y1和y2中较小的数(较小的数作为矩形左上点的坐标),x1-x2的绝对值(矩形长度)和y1-y2的绝对值(矩形高度)。最后,将图形的相应数据保存到形状数组中。

多边形绘制方法:如果字符串是多边形绘制,全局变量i=0(第一步判断是否是多边形绘制),在鼠标按压监控方法中获取鼠标按压的坐标点X,Y,赋给全局变量x1,Y1;在鼠标释放监控方法中,获得鼠标释放的坐标点x和y,并将其分配给全局变量x2和y2。然后用brush对象调用画线方法,将参数x1,y1,x2,y2传入画出的线段,保存该线段的数据,同时重置i++(避免后续的点击动作重置x1,y1和x2,y2)。然后,在鼠标点击方法中,获得鼠标点击的坐标点X,Y,并将其分配给全局变量x3,y3。然后用brush对象调用画线方法在x2,y2和x3,y3之间画线,同时保存该线段的数据。然后将x3,y3赋给x2,y2(为画下一条线做准备)。同时,如果双击这个点,用x1和y1连接并保存这个线段的数据,最后将I重置为0(为绘制下一个多边形做准备)。

曲线绘制方法:如果字符串是曲线绘制,鼠标按下的坐标点X,Y在鼠标按下监控方法中获取并赋给全局变量x1,y1,然后鼠标拖动方法中获取鼠标点的坐标x2,y2,用brush对象调用画线方法,将参数x1,y1,x2,y2传入绘制的线段并保存该线段的数据。然后将x2和y2分配给x1和y1。

最后,添加一个获取面板画笔的方法和一个返回形状数组的方法(供外部使用)。

package draw0924;import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import javax.swing.JButton;public class Listener implements ActionListener,MouseListener,MouseMotionListener{ private Graphics g;int x1,y1,x2,y2,x3,y3,i=0,j=0;String str;Shape[] shape=new Shape[10000]; public Shape[] get() { return shape;//返回保存的图形数组 } public void setg(Graphics g) { this.g=g;//获取外部画笔 } public void actionPerformed(ActionEvent e) { if("".equals(e.getActionCommand())) { JButton jb=(JButton)e.getSource(); Color color=jb.getBackground(); g.setColor(color);//若为颜色按钮则设置画笔颜色 } else { str=e.getActionCommand();//若为绘画方法按钮则获取按钮上字符串 i=0;//切换绘画方法时重置数据 } } @Override public void mouseDragged(MouseEvent e) { if(str=="画曲线") { x2=e.getX(); y2=e.getY(); g.drawLine(x1,y1,x2,y2); shape[j++]=new Shape("画曲线",x1,y1,x2,y2,0,0,g.getColor()); x1=x2; y1=y2; } } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent e) { if("画三角形"==str) { x3=e.getX(); y3=e.getY(); g.drawLine(x1, y1, x3, y3); g.drawLine(x2, y2, x3, y3); i=0;//为画下一个三角形做准备 shape[j++]=new Shape("画三角形",x1,y1,x2,y2,x3,y3,g.getColor()); } if("画多边形"==str) { x3=e.getX(); y3=e.getY(); g.drawLine(x3, y3, x2, y2); shape[j++]=new Shape("画多边形",x2,y2,x3,y3,0,0,g.getColor()); x2=x3; y2=y3; if(e.getClickCount()==2) { g.drawLine(x1, y1, x2, y2); shape[j++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor()); i=0;//为画下一个多边形做准备 } } } @Override public void mousePressed(MouseEvent e) { 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 public void mouseReleased(MouseEvent e) { if("画线"==str) { x2=e.getX(); y2=e.getY(); g.drawLine(x1,y1,x2,y2); shape[j++]=new Shape("画线",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++]=new Shape("画矩形",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++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor()); } } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }}

创建Shape类来保存图形的形状、大小、颜色等数据。

package draw0924;import java.awt.Color;import java.awt.Graphics;public class Shape { private String name; private int x1,y1,x2,y2,x3,y3; private Color m; public Shape(String name,int x1,int y1,int x2,int y2,int x3,int y3,Color m) { this.name=name; this.x1=x1; this.x2=x2; this.y1=y1; this.y2=y2; this.x3=x3; this.y3=y3; this.m=m; } public void drawshape(Graphics g) { 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; } }}

这就是本文的全部内容。希望对大家的学习有帮助,也希望大家能支持一下

0

精彩评论

暂无评论...
验证码 换一张
取 消