1. 程式人生 > 程式設計 >java實現畫圖板功能

java實現畫圖板功能

本文例項為大家分享了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,y2);
  shape[j++]=new Shape("畫曲線",x1,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,y3);
  g.drawLine(x2,y3);
  i=0;//為畫下一個三角形做準備
  shape[j++]=new Shape("畫三角形",g.getColor());
 }
 if("畫多邊形"==str) {
  x3=e.getX();
  y3=e.getY();
  g.drawLine(x3,y2);
  shape[j++]=new Shape("畫多邊形",g.getColor());
  x2=x3;
  y2=y3;
  if(e.getClickCount()==2) {
  g.drawLine(x1,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,y2);
  shape[j++]=new Shape("畫線",g.getColor());
 }
 if("畫三角形"==str) {
   //判斷為畫三角形的第一步
  if(i==0) {
  x2=e.getX();
  y2=e.getY();
  g.drawLine(x1,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("畫矩形",g.getColor());
 }
 if("畫多邊形"==str) {
  //判斷為畫多邊形的第一步
  if(i==0) {
  x2=e.getX();
  y2=e.getY();
  g.drawLine(x1,y2);
  i++;//避免在點選時重置已有的座標值
  shape[j++]=new Shape("畫多邊形",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,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,y2);
  break;
 case "畫三角形":
  g.drawLine(x1,y2);
  g.drawLine(x1,y3);
  g.drawLine(x3,y2);
  break;
 case "畫矩形":
  g.drawRect(Math.min(x1,Math.abs(y1-y2));
  break;
 case "畫多邊形":
  g.drawLine(x1,y2);
  break;
 case "畫曲線":
  g.drawLine(x1,y2);
  break;
 }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。