日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java入门(3)——简易绘图板

發布時間:2023/12/8 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java入门(3)——简易绘图板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡易繪圖板

簡易繪圖板的實現,主要用到了java.awt和javax.swing包中的制作界面的相關知識,其次是Graphics類用于繪圖,最后用監聽器將兩者聯系起來。

監聽器

監聽器用于監聽事件,比如:鼠標點擊、鍵盤輸入等等。他們被定義在java.awt.event這個包中。
安裝監聽器主要有三個步驟:
1、尋找事件源,即當前動作發生的組件。
2、建立事件處理類,將監聽器的抽象方法完善。
3、將事件源和事件處理類綁定。

在簡易繪圖板中,我們主要用到了動作監聽器和鼠標監聽器。動作監聽器用于監聽鼠標點擊和鍵盤輸入空格等動作。鼠標監聽器用于監聽鼠標的動作,如:按下、釋放、進入等等。

Graphics類

Graphics類是java.awt包下的,主要用于繪圖。有繪制圓形、直線,調整畫筆顏色等各種功能。

java.awt與javax.swing包

java.awt與javax.swing包中的一部分類用于基本界面的制作,而我們知道如果想要繪圖必須要有窗體,因此我們需要掌握界面制作的基本知識,包括:窗體、按鈕、布局、文本框等等。而這些組件都在java.awt或者javax.swing包下面。

簡易繪圖板實現

功能介紹

1、可以畫出直線、圓、矩形、三角形、多邊形。
2、可以選取不同的顏色。
3、可以顯示畫筆當前顏色。
4、可以保存畫下的圖形,不會因為拉伸窗口而消失。(通過每次打開再重新繪制一遍實現)

實現步驟

1、建立三個類:
DrawUI(用于繪圖)
DrawListener(用于寫事件監聽器)
Shape(用于保存畫下的圖形)。

2、在DrawUI(事先繼承JFrame窗體類)中創建窗體、事件監聽器、Graphics的繪圖范圍獲取、并將鼠標監聽器和Graphics繪圖范圍相連。

this.setTitle("簡易繪圖板");this.setSize(1000, 800);this.setDefaultCloseOperation(3);FlowLayout fl=new FlowLayout();this.setLayout(fl);DrawListener dl=new DrawListener();this.setVisible(true);//開始在顯卡下顯示//獲取繪圖板范圍,注意傳參的是Graphics而不是JFrame;Graphics g=this.getGraphics();//一定要先讓窗體顯示,才可以獲得它的圖形,進而設置了繪圖范圍。//給窗體加上鼠標監聽器this.addMouseListener(dl);//讓鼠標監聽器活動的范圍設置成畫圖的范圍。dl.g=g;

3、DrawListener類和MouseListener、ActionListener兩個接口相連,同時完善相關抽象方法。

public class DrawListener implements MouseListener,ActionListener{//用于存儲圖形很計數Shape[] arrayShape=new Shape[100];int countShape=0;//繪圖用到的坐標int x1,x2,y1,y2,x3,y3,x4,y4,x5,y5;//多邊形用動態數組存儲int []x=new int[100];int []y=new int[100];int count_duobianxingX=0;int count_duobianxingY=0;//count用于三角形的三個坐標的計步int count=0;//畫筆Graphics g;//按鈕,此按鈕用于顯畫筆當前顏色JButton jbuc;//str記錄按鈕上的文字,從而判斷要求畫的是哪種圖形String str="123";//將DrawUI中的按鈕傳到DrawListener中public void setJBu(JButton jbu){jbuc=jbu;}//重寫ActionListener的抽象方法public void actionPerformed(ActionEvent e){//如果按鈕上沒有字體,那么是改變顏色的按鈕。if(e.getActionCommand().equals("")){JButton jb1= (JButton)e.getSource();g.setColor(jb1.getBackground());jbuc.setBackground(jb1.getBackground());}else str=e.getActionCommand();}//重寫MouseListener的抽象方法public void mouseClicked(MouseEvent e){if(str.equals("三角形")){if(count==0){x3=e.getX();y3=e.getY();g.drawOval(x3-4, y3-4, 8, 8);count++;}else if(count==1){x4=e.getX();y4=e.getY();g.drawOval(x4-4, y4-4, 8, 8);g.drawLine(x3, y3, x4, y4);count++;}else if(count==2){x5=e.getX();y5=e.getY();g.drawOval(x5-4, y5-4, 8, 8);g.drawLine(x3, y3, x5, y5);g.drawLine(x4, y4, x5, y5);//畫完之后一定要立刻存儲,下同。arrayShape[countShape++]=new Shape(x3,x4,x5,y3,y4,y5,str,g.getColor());count=0;}}if(str.equals("多邊形")){if(e.getButton()==1){x[count_duobianxingX++]=e.getX();y[count_duobianxingY++]=e.getY();g.drawOval(e.getX()-4 ,e.getY()-4, 8, 8);if(count_duobianxingX!=1){g.drawLine(e.getX(), e.getY(), x[count_duobianxingX-2], y[count_duobianxingY-2]);}}//以右擊鼠標代表多邊形最后一個頂點else if(e.getButton()==3){ x[count_duobianxingX++]=e.getX();y[count_duobianxingY++]=e.getY();g.drawOval(e.getX()-4 ,e.getY()-4, 8, 8);g.drawLine(e.getX(), e.getY(), x[count_duobianxingX-2], y[count_duobianxingY-2]);g.drawLine(x[0], y[0], e.getX(), e.getY());arrayShape[countShape++]=new Shape(x,y,str,g.getColor(),count_duobianxingX);count_duobianxingX=0;count_duobianxingY=0;}} }public void mousePressed(MouseEvent e){x1=e.getX();y1=e.getY();} //直線、矩形、圓都是釋放鼠標代表開始畫public void mouseReleased(MouseEvent e){x2=e.getX();y2=e.getY();if(str.equals("直線")){g.drawLine(x1, y1, x2, y2);arrayShape[countShape++]=new Shape(x1,x2,y1,y2,str,g.getColor());}if(str.equals("矩形")){g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));arrayShape[countShape++]=new Shape(x1,x2,y1,y2,str,g.getColor());}if(str.equals("圓")){g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));arrayShape[countShape++]=new Shape(x1,x2,y1,y2,str,g.getColor());}}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){} }

4、在DrawUI中添加按鈕,并將按鈕和DrawListenr相連。

//三個添加按鈕的重載函數public JButton addButton(JFrame jf,DrawListener dl){JButton jbu=new JButton();jbu.setBackground(Color.BLACK);jbu.setPreferredSize(new Dimension(30,100));this.add(jbu);jbu.addActionListener(dl);return jbu;}public void addButton(String str,JFrame jf,DrawListener dl){JButton jbu=new JButton(str);this.add(jbu);jbu.addActionListener(dl);}public void addButton(Color col,JFrame jf,DrawListener dl){JButton jbu=new JButton();jbu.setBackground(col);jbu.setPreferredSize(new Dimension(30,30));//組件都要用Setpreferredsize來設置大小this.add(jbu);jbu.addActionListener(dl);} //圖形選項按鈕String[] jbustr= {"直線","圓","矩形","三角形","多邊形"};for(int i=0;i<jbustr.length;i++){addButton(jbustr[i],this,dl);}//將顯示當前顏色的按鈕傳到監聽器中,在監聽器中改變它的顏色JButton jbuc=addButton(this,dl);dl.setJBu(jbuc);// 顏色選項按鈕Color[] jbucol= {Color.black,Color.BLUE,Color.cyan,Color.darkGray,Color.green,Color.orange,Color.PINK,Color.red};for(int i=0;i<jbucol.length;i++){addButton(jbucol[i],this,dl);}

5、完善Shape類。

public class Shape {//存儲圖形需要的坐標private int x1,x2,y1,y2,x3,y3,x4,y4,x5,y5; //存儲多邊形需要的數組和計數private int[] x=new int[100];private int[] y=new int[100];private int count_duobianxing; //圖形類型和顏色private String name;private Color col; //通過構造函數重載實現保存不同的圖形public Shape(int x1,int x2,int y1,int y2,String name,Color col){this.col=col;this.name=name;this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;}public Shape(int x1,int x2,int x3,int y1,int y2,int y3,String name,Color col){this.col=col;this.name=name;this.x1=x1;this.x2=x2;this.x3=x3;this.y1=y1;this.y2=y2;this.y3=y3;}public Shape(int[] x,int[] y,String name,Color col,int c){this.col=col;this.name=name;System.arraycopy(x, 0, this.x, 0, c);System.arraycopy(y, 0, this.y, 0, c);this.count_duobianxing=c;} //注意繪圖時參數時畫筆gpublic void Draw(Graphics g){switch(this.name){case("直線"):{g.setColor(col);g.drawLine(x1, y1, x2, y2);break;}case("矩形"):{g.setColor(col);g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));break;}case("圓"):{g.setColor(col);g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));break;}case("三角形"):{g.setColor(col);g.drawOval(x1-4, y1-4, 8, 8);g.drawOval(x2-4, y2-4, 8, 8);g.drawOval(x3-4, y3-4, 8, 8);g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y2, x3, y3);g.drawLine(x1, y1, x3, y3);}case("多邊形"):{g.setColor(col);for(int i=0;i<count_duobianxing;i++){g.drawOval(x[i]-4,y[i]-4,8,8);if(i!=count_duobianxing-1)g.drawLine(x[i], y[i], x[i+1], y[i+1]);elseg.drawLine(x[0], y[0],x[count_duobianxing-1],y[count_duobianxing-1]);} }}} }

6、在DrawUI中建立Shape數組,并將DrawListener中的Shape數組傳過來,以便在每次窗體初始化調用paint函數時顯示。

private Shape[] arrayShape=new Shape[100]; arrayShape=dl.arrayShape; public void paint(Graphics g){super.paint(g);for(int i=0;i<this.arrayShape.length;i++){arrayShape[i].Draw(g);}}

效果

總結

以上是生活随笔為你收集整理的java入门(3)——简易绘图板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。