本文實例為大家分享了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