问题描述

  • 至少提供自由绘画、直线、椭圆、矩形四种模式
  • 可插入文本
  • 背景色与前端颜色可选
  • 图形绘制可选择填充模式与非填充模式
  • 绘画的作品可进行保存与加载

总体框架

主体框架即DrawBoard继承自JFrame,上设:

  • 2个JPanel(menu与tool,内含数个JButton);
  • 1个DrawPanel(继承自JPanel),即画板主体;
  • 1个TextArea,在状态变更时显示相应信息。

效果如图:

  • 上方JPanel为菜单,可进行:

    • 打开/保存文件(序列化)
    • 选择前端颜色
    • 选择是否填充图形
    • 设置背景颜色
  • 左方JPanel为工具,可供用户在中央画板进行绘画,可选模式为:

    • 自由绘画
    • 直线
    • 椭圆
    • 矩形
  • 可在中央画布单击鼠标右键插入文本(下方TextArea有提醒)

实现思路

共7个类,如下图:

  • Dshape与Dstr存储已生成的Shape与String;
  • DArray由两个ArrayList组成,还有一个Color记录背景色,类别分别为Dshape与Dstr,相当于存储器,是存储以及获取文件时序列化的对象;
  • MA继承自MouseAdapter,是DrawPanel最主要的一个监听器,4种绘画模式都要用到,即在鼠标按下时确定起点,释放时确定终点;
  • MMA继承自MouseMotionAdapter,是DrawPanel的另一个监听器,仅自由绘画模式会用到,即在鼠标拖动时记录划过的点作为上一条线段的终点及下一条线段的起点,多条线段做出自由绘画的感觉;
  • DrawPanel作为主体,记录当前的前端颜色、填充状态、图形类别,并通过重写paintComponent方法以绘制已记录的和正在绘制的图形;
  • MTLis继承自ActionListener,是DrawBoard的监听器,根据触发的按钮进行操作;
  • DrawBoard继承自JFrame,起框架作用。

源代码


import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;import java.util.ArrayList;
import javax.swing.*;class Dshape implements Serializable{private static final long serialVersionUID = 1L;Shape s;Color c;boolean f;//填充状态String m=new String();//绘画模式private void writeObject(java.io.ObjectOutputStream out) throws IOException{out.defaultWriteObject();}private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{in.defaultReadObject();}
}
class Dstr implements Serializable{private static final long serialVersionUID = 1L;String s;Font f;Color c;int x,y;//坐标private void writeObject(java.io.ObjectOutputStream out) throws IOException{out.defaultWriteObject();}private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{in.defaultReadObject();}
}
class DArray implements Serializable{private static final long serialVersionUID = 1L;ArrayList<Dshape> shapelist=new ArrayList<Dshape>();ArrayList<Dstr> strlist=new ArrayList<Dstr>();Color backColor;//背景色private void writeObject(java.io.ObjectOutputStream out) throws IOException{out.defaultWriteObject();}private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{in.defaultReadObject();}
}class MA extends MouseAdapter{DrawPanel dp;MA(DrawPanel dp){super();this.dp=dp;}@Overridepublic void mousePressed(MouseEvent e){//鼠标按下if(dp.tempshape!=null) {dp.da.shapelist.add(dp.tempshape);}switch(dp.model)//据绘制模式对“当前绘制图形(tempshape)”进行初始化{case "Draw":case "Line":{dp.tempshape=new Dshape();Line2D l=new Line2D.Double();l.setLine(e.getX(), e.getY(), e.getX(), e.getY());dp.tempshape.c=dp.currColor;dp.tempshape.s=l;dp.tempshape.f=dp.fill;dp.tempshape.m="Line";break;}case "Ellipse":{dp.tempshape=new Dshape();Ellipse2D ep=new Ellipse2D.Double();ep.setFrame(e.getX(), e.getY(), 0, 0);dp.tempshape.c=dp.currColor;dp.tempshape.s=ep;dp.tempshape.f=dp.fill;dp.tempshape.m="Ellipse";break;}case "Rectangle":{dp.tempshape=new Dshape();Rectangle2D ra=new Rectangle2D.Double();ra.setFrame(e.getX(), e.getY(), 0, 0);dp.tempshape.c=dp.currColor;dp.tempshape.s=ra;dp.tempshape.f=dp.fill;dp.tempshape.m="Rectangle";break;}}}@Overridepublic void mouseReleased(MouseEvent e){//鼠标松开switch(dp.model)//完成tempshape的绘制{case "Draw":case "Line":{Line2D l=(Line2D)(dp.tempshape.s);l.setLine(l.getX1(), l.getY1(), e.getX(), e.getY());dp.repaint();break;}case "Ellipse":{Ellipse2D ep=(Ellipse2D)(dp.tempshape.s);ep.setFrame(ep.getX(), ep.getY(), e.getX()-ep.getX(), e.getY()-ep.getY());dp.repaint();break;}case "Rectangle":{Rectangle2D ra=(Rectangle2D)(dp.tempshape.s);ra.setFrame(ra.getX(), ra.getY(), e.getX()-ra.getX(), e.getY()-ra.getY());dp.repaint();break;}}}@Overridepublic void mouseClicked(MouseEvent e){//鼠标点击//插入文本if(e.getButton()==MouseEvent.BUTTON3){String inputValue = JOptionPane.showInputDialog("Please input text"); Font f=new Font("宋体",20,20);Dstr ms=new Dstr();ms.s=inputValue;ms.c=dp.currColor;ms.f=f;ms.x=e.getX();ms.y=e.getY();dp.da.strlist.add(ms);dp.repaint();}}
}
class MMA extends MouseMotionAdapter{private static final long serialVersionUID = 1L;DrawPanel dp;MMA(DrawPanel dp){super();this.dp=dp;}@Overridepublic void mouseDragged(MouseEvent e) {//鼠标拖动//仅自由绘画模式触发if(dp.model.equals("Draw")){if(dp.tempshape!=null) {Line2D l=(Line2D)(dp.tempshape.s);l.setLine(l.getX1(), l.getY1(), e.getX(), e.getY());dp.da.shapelist.add(dp.tempshape);}dp.tempshape=new Dshape();Line2D l=new Line2D.Double();l.setLine(e.getX(), e.getY(), e.getX(), e.getY());dp.tempshape.c=dp.currColor;dp.tempshape.s=l;dp.repaint();}}
}class DrawPanel extends JPanel{DArray da= new DArray();Dshape tempshape;Color currColor;boolean fill=false;String model=new String();DrawPanel(){super();MA ma=new MA(this);this.addMouseListener(ma);MMA mma=new MMA(this);this.addMouseMotionListener(mma);//设置监听器}@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2d=(Graphics2D) g;for(Dshape ms:da.shapelist) {g2d.setColor(ms.c);if(ms.f&&!ms.m.equals("Line"))g2d.fill(ms.s);elseg2d.draw(ms.s);}//绘制已记录的图形for(Dstr ms:da.strlist) {g2d.setColor(ms.c);g2d.setFont(ms.f);g2d.drawString(ms.s,ms.x,ms.y);}//插入已记录的文本if(tempshape!=null) {g2d.setColor(tempshape.c);if(tempshape.f&&!tempshape.m.equals("Line"))g2d.fill(tempshape.s);elseg2d.draw(tempshape.s);}//记录当前绘制的图形(若非null)}}class MTLis implements ActionListener{DrawBoard bo;MTLis(DrawBoard bo){super();this.bo=bo;}@Overridepublic void actionPerformed(ActionEvent ae) {// TODO Auto-generated method stubif(ae.getSource().getClass()==JButton.class){JButton mid=(JButton)ae.getSource();if(mid.getText().equals("Open")){JFileChooser jf=new JFileChooser();jf.showOpenDialog(bo);   String s=jf.getSelectedFile().toString();File f=new File(s);try {read(f);} catch (ClassNotFoundException | IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}bo.dpl.repaint();bo.dpl.setBackground(bo.dpl.da.backColor);bo.message.append("File open "+s+"\n");}//加载文件并将其绘制出来,同时设置背景色if(mid.getText().equals("Save")){if(bo.dpl.tempshape!=null)bo.dpl.da.shapelist.add(bo.dpl.tempshape);JFileChooser jf=new JFileChooser();int n=jf.showSaveDialog(bo);String s=jf.getSelectedFile().toString();File f=new File(s);try {write(f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}bo.message.append("File save "+s+"\n");}//记录当前绘制图形,序列化保存if(mid.getText().equals("Color")) {JColorChooser jc=new JColorChooser();              Color c=jc.showDialog(bo, null, null);bo.dpl.currColor=c;bo.message.append("Color set "+c.toString()+"\n"); }//更改前端颜色if(mid.getText().equals("Fill")){bo.dpl.fill=!bo.dpl.fill;          bo.message.append("Fill change "+bo.dpl.fill+"\n");}//更改填充状态if(mid.getText().equals("BackgroundColor")) {JColorChooser jc=new JColorChooser();             Color c=jc.showDialog(bo, null, null);bo.dpl.setBackground(c);bo.dpl.da.backColor=c;bo.message.append("BackgroundColor set "+c.toString()+"\n");    }//更改背景色if(mid.getText().equals("Draw")){bo.dpl.model="Draw";bo.message.append("Model change "+bo.dpl.model+"\n");}if(mid.getText().equals("Line")){bo.dpl.model="Line";bo.message.append("Model change "+bo.dpl.model+"\n");}if(mid.getText().equals("Ellipse")){bo.dpl.model="Ellipse";bo.message.append("Model change "+bo.dpl.model+"\n");}if(mid.getText().equals("Rectangle")){bo.dpl.model="Rectangle";bo.message.append("Model change "+bo.dpl.model+"\n");}//更改绘画模式}}void write(File f) throws IOException{FileOutputStream fo=new FileOutputStream(f);@SuppressWarnings("resource")ObjectOutputStream oo=new ObjectOutputStream(fo);oo.writeObject(bo.dpl.da);}//序列化写void read(File f) throws IOException, ClassNotFoundException{FileInputStream fi=new FileInputStream(f);@SuppressWarnings("resource")ObjectInputStream oi=new ObjectInputStream(fi);DArray dp=(DArray)oi.readObject();bo.dpl.da=dp;}//序列化读
}public class DrawBoard extends JFrame{JPanel menu;JButton open,save,color,fill,bgc;JPanel tool;JButton draw,line,el,rect;DrawPanel dpl;JTextArea message;JScrollPane frame;DrawBoard(String title){super();this.setTitle(title);menu=new JPanel(new GridLayout(1,5));open=new JButton("Open");save=new JButton("Save");color=new JButton("Color");fill=new JButton("Fill");bgc=new JButton("BackgroundColor");menu.add(open);menu.add(save);menu.add(color);menu.add(fill);menu.add(bgc);tool=new JPanel(new GridLayout(4,1));draw=new JButton("Draw");line=new JButton("Line");el=new JButton("Ellipse");rect=new JButton("Rectangle");tool.add(draw);tool.add(line);tool.add(el);tool.add(rect);dpl=new DrawPanel();String m="Please click right mouse button where you wanna to input text\n";message=new JTextArea(m,3,5);frame = new JScrollPane(message);this.getContentPane().add("North",menu);this.getContentPane().add("West",tool);this.getContentPane().add("Center",dpl);this.getContentPane().add("South",frame);addli();this.setSize(800,500);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);    }void addli(){MTLis m =new MTLis(this);open.addActionListener(m);save.addActionListener(m);color.addActionListener(m);fill.addActionListener(m);bgc.addActionListener(m);draw.addActionListener(m);line.addActionListener(m);el.addActionListener(m);rect.addActionListener(m);}//加入监听器public static void main(String[]arg){DrawBoard d=new DrawBoard("Test");}
}

Java实现简单画图工具相关推荐

  1. Java课程设计-画图工具

    摘要 根据Windows自带的画图工具,进行简单的仿照,运行后用户可以实现简单的绘画,例如画三角形.多边形.矩形.曲线.直线,用户还可以根据需要选择喜欢的颜色进行绘画,并做到改变窗口大小或最小化窗口后 ...

  2. java简易画图工具_求Java简单画图工具

    展开全部 ///保存一个pb.java文件直接编译执e68a8462616964757a686964616f31333262363631行 import java.applet.*; import j ...

  3. Java. JFrame简单画图

    import javax.swing.*; import java.awt.*;public class DrawCircle extends JFrame{//JFrame对应一个窗口//定义一个面 ...

  4. Python超简单容易上手的画图工具库

    今天,在网上发现一款很棒的python画图工具库.很简单的api调用就能生成漂亮的图表.并且可以进行一些互动. pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开 ...

  5. 计算机画图水印怎么可以消除,如何去掉图片水印 画图工具简单去掉图片水印教程-电脑教程...

    相信大家都会有这样的经历,在网上下载的很多图片上都会有水印,但如果我们为了美观,要去掉图片水印该如何实现呢?对于很多朋友来说,这可能是一个比较复杂的问题,因为自己不会PS.其实华强电子网小编告诉大家, ...

  6. Java之GUI编程学习笔记六 —— AWT相关(画笔paint、鼠标监听事件、模拟画图工具)

    Java之GUI编程学习笔记六 -- AWT相关(画笔paint) 参考教程B站狂神https://www.bilibili.com/video/BV1DJ411B75F 了解paint Frame自 ...

  7. java dateutils_Java中简单日期工具类DateUtils的实现

    最近工作时经常处理日期,想起以前sql server中datediff,dateadd 等方法非常好用,于是想在java中实现类以的功能,而且提高精度,所以初步有了以下代码: package com. ...

  8. 横空出世,比Visio快10倍的画图工具来了。

    来源:网络 图片 总有童鞋问,这个流程图图怎么绘制的,这个UML类图用什么工具做的等等,今天给大家推荐一款idea插件PlantUml,来帮助大家快速快速完成绘制. PlantUml是什么 Plant ...

  9. java编程打印以下图形,分享java打印简单图形的实现代码

    我们平时都是使用的画图工具进行简单图形的绘制,今天我们使用java打印一些简单的图形 实现代码如下 package test; /** * * @author hanzel * @打印图形 * */ ...

最新文章

  1. Visual Studio 2005 Team System下载地址
  2. Java模式(适配器模式)
  3. c语言常用的字符串处理函数
  4. VSTS2008和FTS2008的系统要求好高啊~
  5. Process 执行shell 脚本
  6. 学习Java之前的一些话
  7. 看懂理解 keyboard中 , navigation的设置: 切换工作区和移动窗口到不同的工作区.
  8. CCF201412-4 最优灌溉(100分)
  9. UVALive5379 UVA270 Lining Up【输入输出+水题】
  10. 移除span的html,从最后一个span元素的伪元素内容中移除::
  11. iphone 控制 android手机,苹果手机如何远程控制安卓手机
  12. 天宇优配|利好太多,写不下了!A股港股全线走高,股民嗨了
  13. ab性能测试工具使用
  14. 注塑机设备工业物联网智能解决方案
  15. 科技论文中字母正斜体及大小写的规范写法
  16. Google的搜索结果真的没有人为参与吗?
  17. 502粘到手上变硬了怎么办_急手被502胶水粘住了怎么办?
  18. 戴尔科技 赢在“边缘”
  19. [转]奇虎360黑匣子之谜:暗藏后门盗取用户隐私
  20. 拆分中石油:多种方案流传 但启动阻力重重

热门文章

  1. Centos7学习——echo命令
  2. 借助幕课网的资源重新梳理下PHP基础知识,用以备忘。
  3. python调用海康威视工业相机SDK实现图片采集
  4. WebLogic 10.3.6.0 部署安装问题(简装版)
  5. CGB2106-Day01
  6. 采用16线激光雷达调用cartographer室内定位
  7. 大數據環境搭建,數據採集,數倉環境準備(hive on spark) 01
  8. [转] 理解Web路由
  9. /etc下的host配置文件们
  10. 谷歌验证码recaptcha接入