java实现画图板功能

时间:2021-08-07 04:41:45

本文实例为大家分享了java实现画图板的具体代码,供大家参考,具体内容如下

画图板需要满足的功能有:

画线,画三角形,画矩形,画多边形,画曲线
设置不同颜色的画笔
改变窗口大小或最小化窗口后重新打开时图案不消失

画图方法的编写:

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

在画图方法中首先创建一个窗体,设置好各项参数后,将窗体设置边框布局。由于继承了JPanel类,重写的JPanel的绘制方法对于this生效,所以this为画图部分的面板,将this设置背景色为白色,添加到边框布局的*。再创建一个面板对象(此面板对象用于存放按钮),设置一个背景色并放在边框布局的上方。

由于接下来的按钮和画图面板都需要监听器,于是创建Listener类。Listener类实现ActionListener,MouseListener,MouseMotionListener的接口。Listener类需要重写这些监听器接口的所有方法。

创建字符串数组存放画图形状的名称,接着使用for循环,将字符串添加到各个按钮上,再将按钮添加到面板对象中,最后再给按钮加上按钮监听器;接着再创建颜色类的数组存放各种颜色,同样使用for循环,将颜色设置成按钮的背景色,再将按钮添加到边框布局上方的面板对象中,再给按钮添加监听器。最后再在面板上获取画笔并添加上鼠标监听器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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;i<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;i<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;i<shape.length;i++) {
 if(shape[i]!=null) {
  shape[i].drawshape(g);//图形的绘画
 }
 }
}
}

监听器方法的重写:

首先是点击按钮监听方法的重写:获取按钮上的字符串,如果是空字符串则将监听器内的画笔颜色设置为按钮颜色,如果是绘图方法的字符串(用于以下的监听方法中判断执行绘画方法),并将全局变量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数组的方法(在外部使用)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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类保存图形的形状,大小和颜色等各项数据。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Thirty_creed/article/details/108804719