欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實現畫圖板功能

 更新時間:2020年09月29日 17:02:55   作者:翱翔道浮  
這篇文章主要為大家詳細介紹了java實現畫圖板功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

畫圖方法的編寫:

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

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

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

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

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();//創(chuàng)建一個面板對象
 panel.setBackground(Color.GREEN);
 jf.add(panel,BorderLayout.NORTH);//添加到邊框布局的上方
 Listener butt=new Listener();//創(chuàng)建監(jiān)聽器類,并創(chuàng)建一個監(jiān)聽器對象
 String[] str= {"畫線","畫三角形","畫矩形","畫多邊形","畫曲線"};//創(chuàng)建字符串數組存儲按鈕文字
 for(int i=0;i<str.length;i++) {
 JButton jbu=new JButton(str[i]);//創(chuàng)建按鈕對象并把按鈕文字添加上
 panel.add(jbu);//將按鈕添加到面板對象上
 jbu.addActionListener(butt);//給按鈕添加監(jiān)聽器
 }
 Color[] color= {Color.RED,Color.BLUE,new Color(104,150,144)};//創(chuàng)建顏色數組存儲畫筆顏色
 for(int i=0;i<color.length;i++) {
 JButton jbu=new JButton();//創(chuàng)建按鈕對象
 jbu.setBackground(color[i]);//將按鈕背景設置顏色
 panel.add(jbu);//將按鈕添加到面板對象上
 jbu.setPreferredSize(new Dimension(30,30));//設置按鈕大小
 jbu.addActionListener(butt);//給按鈕添加監(jiān)聽器
 }
 this.setBackground(Color.WHITE);//將繼承來的面板設置背景色
 jf.add(this,BorderLayout.CENTER);//將此面板添加到邊框布局的中央
 jf.setVisible(true);
 Graphics g=this.getGraphics();//在要繪畫的面板上獲取畫筆(要在窗口可視化之后)
 butt.setg(g);//將畫筆傳入監(jiān)聽器
 this.addMouseListener(butt);//給要繪畫的面板添加鼠標監(jiān)聽器
 this.addMouseMotionListener(butt);//給要繪制的面板添加鼠標監(jiān)聽器
 shape=butt.get();//將監(jiān)聽器內保存的圖形保存到此類的全局變量中
}
public void paint(Graphics g) {
 super.paint(g);//父類的繪畫方法
 for(int i=0;i<shape.length;i++) {
 if(shape[i]!=null) {
 shape[i].drawshape(g);//圖形的繪畫
 }
 }
}
}

監(jiān)聽器方法的重寫:

首先是點擊按鈕監(jiān)聽方法的重寫:獲取按鈕上的字符串,如果是空字符串則將監(jiān)聽器內的畫筆顏色設置為按鈕顏色,如果是繪圖方法的字符串(用于以下的監(jiān)聽方法中判斷執(zhí)行繪畫方法),并將全局變量i重置為0(在切換畫圖方法時可重置數據)。

畫線方法:若字符串為畫線,則在鼠標按壓監(jiān)聽方法中獲取鼠標按壓下的坐標點x,y并賦值給全局變量x1,y1;在鼠標釋放監(jiān)聽方法中獲取鼠標釋放的坐標點x,y并賦值給全局變量x2,y2。再用畫筆對象調用畫線方法,將x1,y1,x2,y2參數傳入畫出線段。最后保存畫圖形狀,x1,y1,x2,y2和畫筆顏色的數據到Shape類中的shape數組。(Shape類在后面說明)。

畫三角形方法:若字符串為畫三角形,且全局變量i=0(判斷是否為畫三角形的第一步),則在鼠標按壓監(jiān)聽方法中獲取鼠標按壓下的坐標點x,y并賦值給全局變量x1,y1;在鼠標釋放監(jiān)聽方法中獲取鼠標釋放的坐標點x,y并賦值給全局變量x2,y2。再用畫筆對象調用畫線方法,將x1,y1,x2,y2參數傳入畫出線段同時將i++(避免之后的點擊動作重置x1,y1和x2,y2)。接著在鼠標點擊方法中獲取鼠標點擊的坐標點x,y并賦值給全局變量x3,y3,再用畫筆對象調用畫線方法,分別畫出該點與線段兩個端點的連線,再將i重置為0(為畫下一個三角形做準備)。最后再保存圖形的相應數據到shape數組。

畫矩形方法:若字符串為畫矩形,則在鼠標按壓監(jiān)聽方法中獲取鼠標按壓下的坐標點x,y并賦值給全局變量x1,y1;在鼠標釋放監(jiān)聽方法中獲取鼠標釋放的坐標點x,y并賦值給全局變量x2,y2。再用畫筆對象調用畫矩形方法,傳入參數x1,x2中較小的數,y1,y2中較小的數(較小的數作為矩形的左上方點的坐標),x1-x2的絕對值(矩形長度),y1-y2的絕對值(矩形高度)。最后再保存圖形的相應數據到shape數組。

畫多邊形方法:若字符串為畫多邊形,且全局變量i=0(判斷是否為畫多邊形的第一步),則在鼠標按壓監(jiān)聽方法中獲取鼠標按壓下的坐標點x,y并賦值給全局變量x1,y1;在鼠標釋放監(jiān)聽方法中獲取鼠標釋放的坐標點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(為畫下一個多邊形做準備)。

畫曲線方法:若字符串為畫曲線,則在鼠標按壓監(jiān)聽方法中獲取鼠標按壓下的坐標點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
 
 }

}

創(chuàng)建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實現Excel轉PDF的兩種方法詳解

    Java實現Excel轉PDF的兩種方法詳解

    使用具將Excel轉為PDF的方法有很多,在這里我給大家介紹兩種常用的方法:使用spire轉化PDF、使用jacob實現Excel轉PDF,分別應對兩種不一樣的使用場景,需要的可以參考一下
    2022-01-01
  • Java讀取Excel、docx、pdf和txt等文件萬能方法舉例

    Java讀取Excel、docx、pdf和txt等文件萬能方法舉例

    在Java開發(fā)中處理文件是常見需求,本文以實際代碼示例詳述如何使用ApachePOI庫及其他工具讀取和寫入Excel、Word、PDF等文件,介紹了ApachePOI、ApachePDFBox和EasyExcel等庫的使用方法,幫助開發(fā)者有效讀取不同格式文件,需要的朋友可以參考下
    2024-09-09
  • springboot2自動加載sql文件的實現

    springboot2自動加載sql文件的實現

    本文主要介紹了springboot2自動加載sql文件的實現,通過配置文件或注解的方式,我們可以輕松地將SQL語句映射到數據庫中,實現自動加載,感興趣的可以了解一下
    2023-11-11
  • 23種設計模式(9) java橋接模式

    23種設計模式(9) java橋接模式

    這篇文章主要為大家詳細介紹了java設計模式之橋接模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • IDEA下創(chuàng)建SpringBoot+MyBatis+MySql項目實現動態(tài)登錄與注冊功能

    IDEA下創(chuàng)建SpringBoot+MyBatis+MySql項目實現動態(tài)登錄與注冊功能

    這篇文章主要介紹了IDEA下創(chuàng)建SpringBoot+MyBatis+MySql項目實現動態(tài)登錄與注冊功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Spring@Value屬性注入使用方法解析

    Spring@Value屬性注入使用方法解析

    這篇文章主要介紹了Spring@Value屬性注入使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • java實現簡單銀行ATM系統

    java實現簡單銀行ATM系統

    這篇文章主要為大家詳細介紹了java實現簡單銀行ATM系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringBoot修改子模塊Module的jdk版本的方法 附修改原因

    SpringBoot修改子模塊Module的jdk版本的方法 附修改原因

    這篇文章主要介紹了SpringBoot修改子模塊Module的jdk版本的方法 附修改原因,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java定時任務Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    Java定時任務Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    這篇文章主要介紹了Java定時任務Timer、TimerTask與ScheduledThreadPoolExecutor詳解,  定時任務就是在指定時間執(zhí)行程序,或周期性執(zhí)行計劃任務,Java中實現定時任務的方法有很多,本文從從JDK自帶的一些方法來實現定時任務的需求,需要的朋友可以參考下
    2024-01-01
  • Java的Hibernate框架中的組合映射學習教程

    Java的Hibernate框架中的組合映射學習教程

    組合映射即是指主對象和子對象關聯且擁有相同的生命周期的映射關系,這里我們將舉一些數據操作的實例,來講解Java的Hibernate框架中的組合映射學習教程
    2016-07-07

最新評論