您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)利用Java怎么實(shí)現(xiàn)一個(gè)畫板功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
基本的思路是這樣的:畫板實(shí)現(xiàn)大致分三部分:一是畫板界面的實(shí)現(xiàn),二是畫板的監(jiān)聽以及畫圖的實(shí)現(xiàn),三是畫板的重繪。(文章較長,但是代碼是逐步遞進(jìn)的,可以按三部分分開來看,實(shí)現(xiàn)了當(dāng)前部分再去看下一部分。)首先是畫板的界面實(shí)現(xiàn),因?yàn)槲覜]有去找具體的圖標(biāo),界面上的所有組件都是Swing的自帶組件,所以界面略微有點(diǎn)簡陋,不過如果想要優(yōu)化也簡單,把界面上的組件都改成自定義的圖標(biāo)即可。界面實(shí)現(xiàn)后,就可以考慮給界面的組件加上監(jiān)聽,不同的圖形根據(jù)具體情況添加不同的監(jiān)聽方法。然后編寫事件處理類依據(jù)不同的圖形編寫畫圖的具體算法。一個(gè)簡易版本的畫圖板基本就差不多可以實(shí)現(xiàn)了。重繪這里先不提放到后面再講。
先來看看畫圖界面的實(shí)現(xiàn):
實(shí)現(xiàn)畫圖界面需要用的API類主要有:FlowLayout,GridLayout,Color,Dimension,JButton,JFrame,JPanel。
定義Draw類,讓Draw類繼承JFrame。設(shè)置它的大小,標(biāo)題,可見性等。需要注意的是這里如果添加的按鈕如果比較多,建議使用數(shù)組來完成按鈕的添加,因?yàn)槿绻苯右粋€(gè)一個(gè)的加按鈕,不僅會(huì)使得代碼量增大,而且不利于查找、添加和代碼的維護(hù)。為了使得界面不至于顯得那么簡陋,這里使用了幾個(gè)Jpanel,和不同的布局管理器。主窗體使用的是流式布局管理器,然后使用三個(gè)面板,分別承裝圖形按鈕,顏色按鈕和畫布。承裝圖形按鈕和顏色按鈕的面板都使用表格布局。然后界面的實(shí)現(xiàn)就基本完成了。
package Cbs; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * Draw類,用于界面的初始化 * @author CBS */ @SuppressWarnings("serial") public class Draw extends JFrame { // 界面初始化方法 public void showUI() { setTitle("畫圖");//窗體名稱 setSize(1200, 900);//窗體大小 setDefaultCloseOperation(3); setLocationRelativeTo(null);//窗體居中 //流式布局左對(duì)齊 FlowLayout layout = new FlowLayout(FlowLayout.LEFT); setLayout(layout);//窗體使用流式布局管理器 this.setResizable(false);//窗體大小不變 //使用數(shù)組保存按鈕名 String buttonName[] = { "畫直線", "畫橢圓", "畫曲線", "多邊形", "橡皮擦", "拖動(dòng)線","三角形", "畫球形", "筆刷", "噴槍", "色子", "立體矩形", "立體圓", "立體三角","迭代分形", "現(xiàn)代分形", "楓葉", "畫樹", "mandelbrot集", "L-System", "迭代畫線","迭代三角形", "謝爾賓斯基地毯", "畫字符", "清空", "吸管" ,"矩形","五角星","多線","字符"}; //用于保存圖形按鈕,使用網(wǎng)格布局 JPanel jp1=new JPanel(new GridLayout(15, 2,10,10)); jp1.setPreferredSize(new Dimension(200, 800)); //循環(huán)為按鈕面板添加按鈕 for (int i = 0; i < buttonName.length; i++) { JButton jbutton = new JButton(buttonName[i]); jp1.add(jbutton); } JPanel jp2=new JPanel();//畫布面板 jp2.setPreferredSize(new Dimension(970, 800)); jp2.setBackground(Color.WHITE); // 定義Color數(shù)組,用來存儲(chǔ)按鈕上要顯示的顏色信息 Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN, Color.MAGENTA,Color.DARK_GRAY,Color.GRAY, Color.LIGHT_GRAY,Color.YELLOW}; //用于保存顏色按鈕的面板 JPanel jp3=newJPanel(newGridLayout(1,colorArray.length,3,3)); // 循環(huán)遍歷colorArray數(shù)組,根據(jù)數(shù)組中的元素來實(shí)例化按鈕對(duì)象 for (int i = 0; i < colorArray.length; i++) { JButton button = new JButton(); button.setBackground(colorArray[i]); button.setPreferredSize(new Dimension(30, 30)); jp3.add(button); } //將面板添加到主窗體 this.add(jp1); this.add(jp2); this.add(jp3); //添加按鈕,作為當(dāng)前顏色 JButton nowColor=new JButton(); nowColor.setPreferredSize(new Dimension(40,40)); nowColor.setBackground(Color.BLACK);//默認(rèn)黑色 add(nowColor); //設(shè)置窗體的組件可見,如果為FALSE就看不到任何組件 setVisible(true); } }
這里還要一點(diǎn)要注意的地方,Jpanel面板的添加先后順序不要改變,這是根據(jù)流式布局算出來的面板大小,讀者可以自行更改調(diào)試。還有一個(gè)就是窗體的setSize方法只對(duì)窗體本身有效,如果要改變其他組件的大小要用setPreferredSize方法。這樣畫圖板的基本界面就實(shí)現(xiàn)。界面的按鈕和面板可以根據(jù)自身需要更改。
這是界面的大概樣子:
監(jiān)聽的實(shí)現(xiàn):
當(dāng)然我們空有個(gè)界面并沒有什么用,我們需要的是點(diǎn)擊不同的按鈕能夠?qū)崿F(xiàn)不同的功能。這里就需要用到事件的監(jiān)聽機(jī)制了。實(shí)現(xiàn)監(jiān)聽的主要API類有: ActionListener,MouseListener,MouseMotionListener。添加事件監(jiān)聽的方法根以前的步驟是一樣的:確定事件源對(duì)象,編寫事件處理類,添加監(jiān)聽方法。畫圖板中的事件源對(duì)象有兩種,一種是按鈕,另一種就是畫布的面板,按鈕使用的是ActionListener,而畫布面板因?yàn)樨?fù)責(zé)的是繪圖,所以使用的是MouseListener和MouseMotionListener。為了實(shí)現(xiàn)事件的監(jiān)聽,我們需要定義一個(gè)事件處理類DrawListener,該類實(shí)現(xiàn)了以上的三個(gè)事件接口。之后在重寫的方法中實(shí)現(xiàn)不同圖形的繪制。圖形的繪制都可以通過Graphics對(duì)象的方法來實(shí)現(xiàn)。但是這里有一個(gè)問題,如何分辨在Draw類中按下的是哪個(gè)按鈕呢?在定義Draw類的時(shí)候,我們使用了圖形按鈕和顏色按鈕,圖形類的按鈕在實(shí)例化對(duì)象的時(shí)候是使用了帶參數(shù)的構(gòu)造方法的,也就是圖形按鈕都是有文字的,而顏色按鈕則沒有。依據(jù)這一點(diǎn)就可以很容易的區(qū)分不同的按鈕了。
DrawListener類:
package Cbs; 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 DrawListener implements ActionListener, MouseListener, MouseMotionListener { private Color color;//顏色屬性 private Graphics g;//畫筆屬性 private String str;//保存按鈕上的字符串,區(qū)分不同的按鈕 private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分別為鼠標(biāo)的按下和釋放時(shí)的坐標(biāo) private JButton nowColor;//當(dāng)前顏色按鈕 //獲取Draw類的畫筆對(duì)象 public void setG(Graphics g) { this.g = g; } //獲取當(dāng)前顏色按鈕 public void setNowColor(JButton nowColor) { this.nowColor = nowColor; } @Override //鼠標(biāo)拖動(dòng)的方法 public void mouseDragged(MouseEvent e) { //畫曲線的方法 if ("畫曲線".equals(str)) { int x, y; x = e.getX(); y = e.getY(); g.drawLine(x, y, x1, y1); x1 = x; y1 = y; } } @Override //鼠標(biāo)移動(dòng)方法 public void mouseMoved(MouseEvent e) { } @Override //鼠標(biāo)單擊方法 public void mouseClicked(MouseEvent e) { } @Override //鼠標(biāo)按下方法 public void mousePressed(MouseEvent e) { g.setColor(color);//改變畫筆的顏色 x1=e.getX();//獲取按下時(shí)鼠標(biāo)的x坐標(biāo) y1=e.getY();//獲取按下時(shí)鼠標(biāo)的y坐標(biāo) } @Override //鼠標(biāo)釋放方法 public void mouseReleased(MouseEvent e) { x2=e.getX();//獲取釋放時(shí)鼠標(biāo)的x坐標(biāo) y2=e.getY();//獲取釋放時(shí)鼠標(biāo)的y坐標(biāo) //畫直線的方法 if ("畫直線".equals(str)) { g.drawLine(x1, y1, x2, y2); } } @Override //鼠標(biāo)進(jìn)入方法 public void mouseEntered(MouseEvent e) { } @Override //鼠標(biāo)退出方法 public void mouseExited(MouseEvent e) { } @Override //處理按鈕上的鼠標(biāo)點(diǎn)擊動(dòng)作 public void actionPerformed(ActionEvent e) { //判斷是顏色按鈕還是圖形按鈕 if ("".equals(e.getActionCommand())) { JButton jb = (JButton) e.getSource(); color = jb.getBackground(); nowColor.setBackground(color);//處理當(dāng)前顏色 } else { str = e.getActionCommand(); } } }
Draw類也要做一些修改,為按鈕和面板添加監(jiān)聽:
package Cbs; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * Draw類,用于界面的初始化 * @author CBS */ @SuppressWarnings("serial") public class Draw extends JFrame { private DrawListener dl; private Graphics g; // 界面初始化方法 public void showUI() { setTitle("畫圖");//窗體名稱 setSize(1200, 900);//窗體大小 setDefaultCloseOperation(3); setLocationRelativeTo(null);//窗體居中 //流式布局左對(duì)齊 FlowLayout layout = new FlowLayout(FlowLayout.LEFT); setLayout(layout);//窗體使用流式布局管理器 this.setResizable(false);//窗體大小不變 //使用數(shù)組保存按鈕名 String buttonName[] = { "畫直線", "畫橢圓", "畫曲線", "多邊形", "橡皮擦", "拖動(dòng)線","三角形", "畫球形", "筆刷", "噴槍", "色子", "立體矩形", "立體圓", "立體三角","迭代分形", "現(xiàn)代分形", "楓葉", "畫樹", "mandelbrot集", "L-System", "迭代畫線","迭代三角形", "謝爾賓斯基地毯", "畫字符", "清空", "吸管" ,"矩形","五角星","多線","字符"}; //用于保存圖形按鈕,使用網(wǎng)格布局 JPanel jp1=new JPanel(new GridLayout(15, 2,10,10)); jp1.setPreferredSize(new Dimension(200, 800)); //實(shí)例化DrawListener對(duì)象 dl=new DrawListener(); //循環(huán)為按鈕面板添加按鈕 for (int i = 0; i < buttonName.length; i++) { JButton jbutton = new JButton(buttonName[i]); jbutton.addActionListener(dl);//為按鈕添加監(jiān)聽 jp1.add(jbutton); } JPanel jp2=new JPanel();//畫布面板 jp2.setPreferredSize(new Dimension(970, 800)); jp2.setBackground(Color.WHITE); // 定義Color數(shù)組,用來存儲(chǔ)按鈕上要顯示的顏色信息 Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN, Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY, Color.YELLOW}; //用于保存顏色按鈕的面板 JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3)); // 循環(huán)遍歷colorArray數(shù)組,根據(jù)數(shù)組中的元素來實(shí)例化按鈕對(duì)象 for (int i = 0; i < colorArray.length; i++) { JButton button = new JButton(); button.setBackground(colorArray[i]); button.setPreferredSize(new Dimension(30, 30)); button.addActionListener(dl);//為按鈕添加監(jiān)聽 jp3.add(button); } //將面板添加到主窗體 this.add(jp1); this.add(jp2); this.add(jp3); //添加按鈕,作為當(dāng)前顏色 JButton nowColor=new JButton(); nowColor.setPreferredSize(new Dimension(40,40)); nowColor.setBackground(Color.BLACK);//默認(rèn)黑色 add(nowColor); //設(shè)置窗體的組件可見,如果為FALSE就看不到任何組件 setVisible(true); //獲取畫筆對(duì)象 g=jp2.getGraphics(); dl.setG(g); dl.setNowColor(nowColor); //為面板添加鼠標(biāo)監(jiān)聽,用于繪制圖形 jp2.addMouseListener(dl); jp2.addMouseMotionListener(dl); } }
drawDrawListener里面只寫了畫直線和曲線的方法,讀者可以根據(jù)自己的需求添加,思路和方式都是一樣的。Draw類里面有些需要注意的地方在這里提一下:一個(gè)是畫筆g的獲取一定要在窗體的可見之后采取獲取,不然獲取的畫筆對(duì)象返回值會(huì)是null。二是要為圖形按鈕添加監(jiān)聽,DrawListener的實(shí)例化需要在setVisible方法之前,所以不建議使用構(gòu)造方法直接傳入g畫筆參數(shù),我使用的是set方法。最后是注意一下使用哪個(gè)添加方法,按鈕使用的是addActionListener方法,畫板面板使用的是addMouseListener和addMouseMotionListener方法。使用畫板面板來獲取畫筆并給畫面面板添加監(jiān)聽是為了讓繪圖的時(shí)候圖形不會(huì)跑出面板外,這里的畫筆和監(jiān)聽都由主窗體獲得也是可以的,不過繪制時(shí)會(huì)出現(xiàn)線畫出面板的問題。
畫板的重繪:
到這里畫板的制作已經(jīng)基本實(shí)現(xiàn)了,我們已經(jīng)可以在上面繪制各種各樣的圖形了。但是細(xì)心的人可能會(huì)發(fā)現(xiàn)一個(gè)問題,那就是如果把窗體最小化之后再次打開,畫板上原本已經(jīng)畫好的東西會(huì)全部都消失了。這樣子肯定是不行的,辛辛苦苦畫的“大作”怎么能說說沒就沒了呢。那么為什么會(huì)出現(xiàn)這樣的問題呢?要回答這個(gè)問題我們就需要先了解Java的繪圖機(jī)制。做畫圖板我們使用的是Swing組件,這套組件是基于原先的AWT組件開發(fā),在繪制的時(shí)候會(huì)調(diào)用系統(tǒng)的畫圖函數(shù),這就是為什么我們可以從面板或者是窗體中獲取畫筆對(duì)象的原因。這也就是說Java中你所能夠看到窗體,按鈕或者其它的所有組件其實(shí)都是畫出來。所以當(dāng)我們點(diǎn)擊窗體使它最小化或者改變大小的時(shí)候,原來的畫的窗體就不能適應(yīng)需要了,這時(shí)系統(tǒng)會(huì)調(diào)用JFrame的paint方法實(shí)現(xiàn)窗體的重繪,也就是再次畫了一個(gè)新的窗體,而JFrame的paint方法只對(duì)窗體已經(jīng)添加的組件有效,我們自己繪制的東西并沒有寫在paint方法里面,所以窗體重繪之后,我們?cè)壤L制的圖形也就消失了。要解決這個(gè)問題我們需要重寫父類的paint方法。但是這樣的話問題又來了,畫圖是在DrawListener類里面實(shí)現(xiàn)的,要怎么把它們弄到paint方法里面去呢?
當(dāng)然方法可能有很多,這里我只介紹我所知道的:要把畫出來的圖形在paint方法中再次畫出來,就需要有東西來保存畫過的圖形。保存可以使用數(shù)組或者集合,這里推薦使用集合,可以很方便的實(shí)現(xiàn)添加,而不需要去考慮大小的問題。數(shù)組的實(shí)現(xiàn)也大同小異,這里就不多做介紹。確定了使用集合,那么集合內(nèi)保存什么類型的數(shù)據(jù)呢?毫無疑問應(yīng)該保存的是圖形的數(shù)據(jù),但是集合使用泛型的話也只能保存同一種類型的數(shù)據(jù),我們卻有那么多種圖形?這里就可以使用接口或者抽象類,我們只需要?jiǎng)?chuàng)建不同得圖形類,讓它繼承抽象類或者是實(shí)現(xiàn)接口。然后每畫一個(gè)圖形就實(shí)例化一個(gè)圖形的對(duì)象,存入集合中,最后在paint方法中遍歷集合,重新繪制圖形即可。
下面直接貼最終代碼(仍然只寫了直線和曲線),只是添加了幾行代碼,注意與前面比較。
//圖形接口 package Cbs; //圖形集合 public interface NetJavaShape { public abstract void draw(); } //直線類 package Cbs; import java.awt.Color; import java.awt.Graphics; import Cbs.NetJavaShape; public class ImpLine implements NetJavaShape{ Graphics g; int x1, y1,x2, y2; Color c; public ImpLine(Graphics g,int x1,int y1,int x2,int y2,Color c){ this.g=g; this.c=c; this.x1=x1; this.y1=y1; this.x2=x2; this.y2=y2; } public void draw() { g.setColor(c); g.drawLine(x1, y1, x2, y2); } } //DrawListener類 package Cbs; import java.awt.Color; import java.awt.Graphics; import java.util.List; 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 java.util.ArrayList; import Cbs.NetJavaShape; import javax.swing.JButton; public class DrawListener implements ActionListener, MouseListener, MouseMotionListener { private Color color=Color.BLACK;//顏色屬性,初始值為黑色 private Graphics g;//畫筆屬性 private String str;//保存按鈕上的字符串,區(qū)分不同的按鈕 private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分別為鼠標(biāo)的按下和釋放時(shí)的坐標(biāo) private JButton nowColor;//當(dāng)前顏色按鈕 //保存圖形對(duì)象的集合 private List<NetJavaShape> shapesArray = new ArrayList<NetJavaShape>(); //圖形 private NetJavaShape shape; //在draw類中獲取集合 public List<NetJavaShape> getShapesArray() { return shapesArray; } //獲取Draw類的畫筆對(duì)象 public void setG(Graphics g) { this.g = g; } //獲取當(dāng)前顏色按鈕 public void setNowColor(JButton nowColor) { this.nowColor = nowColor; } @Override //鼠標(biāo)拖動(dòng)的方法 public void mouseDragged(MouseEvent e) { //畫曲線的方法 if ("畫曲線".equals(str)) { int x, y; x = e.getX(); y = e.getY(); //實(shí)例化對(duì)象,曲線也是直線畫的所以不同新建一個(gè)曲線類了 shape=new ImpLine(g,x,y,x1,y1,color); //調(diào)用畫圖方法 shape.draw(); //將圖形存入集合中 shapesArray.add(shape); // g.drawLine(x, y, x1, y1); x1 = x; y1 = y; } } @Override //鼠標(biāo)移動(dòng)方法 public void mouseMoved(MouseEvent e) { } @Override //鼠標(biāo)單擊方法 public void mouseClicked(MouseEvent e) { } @Override //鼠標(biāo)按下方法 public void mousePressed(MouseEvent e) { g.setColor(color);//改變畫筆的顏色 x1=e.getX();//獲取按下時(shí)鼠標(biāo)的x坐標(biāo) y1=e.getY();//獲取按下時(shí)鼠標(biāo)的y坐標(biāo) } @Override //鼠標(biāo)釋放方法 public void mouseReleased(MouseEvent e) { x2=e.getX();//獲取釋放時(shí)鼠標(biāo)的x坐標(biāo) y2=e.getY();//獲取釋放時(shí)鼠標(biāo)的y坐標(biāo) //畫直線的方法 if ("畫直線".equals(str)) { //實(shí)例化對(duì)象, shape=new ImpLine(g,x1,y1,x2,y2,color); //調(diào)用畫圖方法 shape.draw(); //將圖形存入集合中 shapesArray.add(shape); // g.drawLine(x1, y1, x2, y2); } } @Override //鼠標(biāo)進(jìn)入方法 public void mouseEntered(MouseEvent e) { } @Override //鼠標(biāo)退出方法 public void mouseExited(MouseEvent e) { } @Override //處理按鈕上的鼠標(biāo)點(diǎn)擊動(dòng)作 public void actionPerformed(ActionEvent e) { if ("".equals(e.getActionCommand())) { JButton jb = (JButton) e.getSource(); color = jb.getBackground(); nowColor.setBackground(color);//處理當(dāng)前顏色 } else { str = e.getActionCommand(); } } } //draw類 package Cbs; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridLayout; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * Draw類,用于界面的初始化 * @author CBS */ @SuppressWarnings("serial") public class Draw extends JFrame { private DrawListener dl; private Graphics g; //保存圖形對(duì)象的集合 private List<NetJavaShape> shapesArray = new ArrayList<NetJavaShape>(); // 界面初始化方法 public void showUI() { setTitle("畫圖");//窗體名稱 setSize(1200, 900);//窗體大小 setDefaultCloseOperation(3); setLocationRelativeTo(null);//窗體居中 FlowLayout layout = new FlowLayout(FlowLayout.LEFT);//流式布局左對(duì)齊 setLayout(layout);//窗體使用流式布局管理器 this.setResizable(false);//窗體大小不變 //使用數(shù)組保存按鈕名 String buttonName[] = { "畫直線", "畫橢圓", "畫曲線", "多邊形", "橡皮擦", "拖動(dòng)線","三角形", "畫球形", "筆刷", "噴槍", "色子", "立體矩形", "立體圓", "立體三角","迭代分形", "現(xiàn)代分形", "楓葉", "畫樹", "mandelbrot集", "L-System", "迭代畫線","迭代三角形", "謝爾賓斯基地毯", "畫字符", "清空","吸管" ,"矩形","五角星","多線","字符"}; JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));//用于保存圖形按鈕,使用網(wǎng)格布局 jp1.setPreferredSize(new Dimension(200, 800)); //實(shí)例化DrawListener對(duì)象 dl=new DrawListener(); //循環(huán)為按鈕面板添加按鈕 for (int i = 0; i < buttonName.length; i++) { JButton jbutton = new JButton(buttonName[i]); jbutton.addActionListener(dl);//為按鈕添加監(jiān)聽 jp1.add(jbutton); } JPanel jp2=new JPanel();//畫布面板 jp2.setPreferredSize(new Dimension(970, 800)); jp2.setBackground(Color.WHITE); // 定義Color數(shù)組,用來存儲(chǔ)按鈕上要顯示的顏色信息 Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,Color.YELLOW}; //用于保存顏色按鈕的面板 JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3)); // 循環(huán)遍歷colorArray數(shù)組,根據(jù)數(shù)組中的元素來實(shí)例化按鈕對(duì)象 for (int i = 0; i < colorArray.length; i++) { JButton button = new JButton(); button.setBackground(colorArray[i]); button.setPreferredSize(new Dimension(30, 30)); button.addActionListener(dl);//為按鈕添加監(jiān)聽 jp3.add(button); } //將面板添加到主窗體 this.add(jp1); this.add(jp2); this.add(jp3); //添加按鈕,作為當(dāng)前顏色 JButton nowColor=new JButton(); nowColor.setPreferredSize(new Dimension(40,40)); nowColor.setBackground(Color.BLACK);//默認(rèn)黑色 add(nowColor); //設(shè)置窗體的組件可見,如果為FALSE就看不到任何組件 setVisible(true); //獲取畫筆對(duì)象 g=jp2.getGraphics(); dl.setG(g); dl.setNowColor(nowColor); //獲取保存的集合 shapesArray=dl.getShapesArray(); //為面板添加鼠標(biāo)監(jiān)聽,用于繪制圖形 jp2.addMouseListener(dl); jp2.addMouseMotionListener(dl); } @Override //重寫paint方法 public void paint(Graphics g) { //調(diào)用父類的paint方法,繪制界面上的組件 super.paint(g); //foreach遍歷集合 for (NetJavaShape l : shapesArray) { l.draw(); } } }
這里使用集合添加圖形實(shí)現(xiàn)畫板的重繪時(shí),我是每實(shí)現(xiàn)一個(gè)圖形就會(huì)新建一個(gè)類來保存圖形的信息,這樣圖形類就會(huì)有很多。如果不想創(chuàng)建那么多的圖形類可以把它們都放到一個(gè)類里面,設(shè)置一個(gè)type的參數(shù),賦上按鈕的名稱。然后在draw方法中依據(jù)這個(gè)值判斷是什么圖形實(shí)現(xiàn)不同的畫圖方法。這樣畫板的所有功能基本就實(shí)現(xiàn)了,畫板的項(xiàng)目也就到這里。
看完上述內(nèi)容,你們對(duì)利用Java怎么實(shí)現(xiàn)一個(gè)畫板功能有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。