电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java實現畫圖板功能

瀏覽:57日期:2022-08-23 14:47:10

本文實例為大家分享了java實現畫圖板的具體代碼,供大家參考,具體內容如下

畫圖板需要滿足的功能有:

畫線,畫三角形,畫矩形,畫多邊形,畫曲線設置不同顏色的畫筆改變窗口大小或最小化窗口后重新打開時圖案不消失

畫圖方法的編寫:

創建一個類,繼承JPanel類,重寫JPanel的繪制方法,重寫方法時寫上原有的繪制方法,再添加繪制已有的圖形的方法。(為了在改變窗口大小和最小化窗口后再打開時圖案不消失)

在畫圖方法中首先創建一個窗體,設置好各項參數后,將窗體設置邊框布局。由于繼承了JPanel類,重寫的JPanel的繪制方法對于this生效,所以this為畫圖部分的面板,將this設置背景色為白色,添加到邊框布局的中央。再創建一個面板對象(此面板對象用于存放按鈕),設置一個背景色并放在邊框布局的上方。

由于接下來的按鈕和畫圖面板都需要監聽器,于是創建Listener類。Listener類實現ActionListener,MouseListener,MouseMotionListener的接口。Listener類需要重寫這些監聽器接口的所有方法。

創建字符串數組存放畫圖形狀的名稱,接著使用for循環,將字符串添加到各個按鈕上,再將按鈕添加到面板對象中,最后再給按鈕加上按鈕監聽器;接著再創建顏色類的數組存放各種顏色,同樣使用for循環,將顏色設置成按鈕的背景色,再將按鈕添加到邊框布局上方的面板對象中,再給按鈕添加監聽器。最后再在面板上獲取畫筆并添加上鼠標監聽器。

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數組的方法(在外部使用)。

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; } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 奥因-光触媒除甲醛公司-除甲醛加盟公司十大品牌 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 天长市晶耀仪表有限公司 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 传爱自考网_传爱自学考试网 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 深圳APP开发_手机软件APP定制外包_小程序开发公司-来科信 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 上海佳武自动化科技有限公司 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 24位ADC|8位MCU-芯易德科技有限公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 贵州成人高考网_贵州成考网 | 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 |