java小小工具第二弹 画图
2016-03-02 23:02
423 查看
/*
* 实现对直线,矩形,圆,曲线,颜色变换的绘画
* 利用集合封装线条类型,位置,颜色
* 以及撤销和返还功能
*/
![](http://img.blog.csdn.net/20160302230516541?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
* 实现对直线,矩形,圆,曲线,颜色变换的绘画
* 利用集合封装线条类型,位置,颜色
* 以及撤销和返还功能
*/
package cn.hncu.mytoolkit; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; 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.ImageIcon; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import cn.hncu.set.MySet; public class MyDraw extends JFrame{ private int DRAETYPE=0; private Color DRAECOLOR=Color.black; private static final int DRAELINE=0; private static final int DRAECURVE=1; private static final int DRAERECTANGLE=2; private static final int DRAECIRCLE=4; private JPopupMenu pmenu; private JMenuItem[] menuItem; private JDrawPanel palette; private MySet mySet=new MySet(); private MySet myAdd=new MySet(); private Point state; private Point end; private static final String dir="./images_Draw/"; private boolean drawFlag=false; public MyDraw(){ super("我的简易绘图"); setBounds(200, 80, 600, 400); setDefaultCloseOperation(DISPOSE_ON_CLOSE); palette=new JDrawPanel(); getContentPane().add(palette); //利用快捷菜单来实现功能 pmenu=new JPopupMenu(); String[] str={"直线","曲线","矩形","圆","撤回","返撤","颜色..."}; String[] str0={"line","curve","rectangle","circle","cancle","add","color"}; menuItem=new JMenuItem[str.length]; for (int i = 0; i < menuItem.length; i++) { ImageIcon img=new ImageIcon(dir+str0[i]+".png"); menuItem[i]=new JMenuItem(str[i],img); menuItem[i].setActionCommand(str0[i]); //匿名内部类 menuItem[i].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //设置线的类型 if(e.getActionCommand().equals("line")) DRAETYPE=DRAELINE; else if(e.getActionCommand().equals("curve")) DRAETYPE=DRAECURVE; else if(e.getActionCommand().equals("rectangle")) DRAETYPE=DRAERECTANGLE; else if(e.getActionCommand().equals("circle")) DRAETYPE=DRAECIRCLE; else if(e.getActionCommand().equals("color")){ Color c=JColorChooser.showDialog(null, "颜色选择", Color.black); DRAECOLOR=c; }else if(e.getActionCommand().equals("cancle")){ //对撤销的处理 if(mySet.size()<=0) return; MyGeaph geaph=(MyGeaph)mySet.get(mySet.size()-1); //不是曲线,删除该线条 if(geaph.drawType!=DRAECURVE){ myAdd.add(geaph); mySet.remove(mySet.size()-1); } else{ //是曲线,找到构成曲线所有的点,并删除 while(true){ MyGeaph gelast=(MyGeaph)mySet.get(mySet.size()-1); myAdd.add(gelast); mySet.remove(mySet.size()-1); if(mySet.size()<=0) break; MyGeaph ge=(MyGeaph)mySet.get(mySet.size()-1); if(ge.drawType!=DRAECURVE) break; if(!(gelast.state.x==ge.end.x&&gelast.state.y==ge.end.y)) break; } } palette.repaint(); }else if(e.getActionCommand().equals("add")){ //将撤销的线储存起来,以便返还 if(myAdd.size()<=0) return; MyGeaph geaph=(MyGeaph)myAdd.get(myAdd.size()-1); if(geaph.drawType!=DRAECURVE){ mySet.add(geaph); myAdd.remove(myAdd.size()-1); } else{ while(true){ MyGeaph gelast=(MyGeaph)myAdd.get(myAdd.size()-1); mySet.add(gelast); myAdd.remove(myAdd.size()-1); if(myAdd.size()<=0) break; MyGeaph ge=(MyGeaph)myAdd.get(myAdd.size()-1); if(ge.drawType!=DRAECURVE) break; if(!(gelast.end.x==ge.state.x&&gelast.end.y==ge.state.y)) break; } } palette.repaint(); } } }); pmenu.add(menuItem[i]); } palette.add(pmenu); //鼠标监听 palette.addMouseListener(new MouseListener(){ @Override public void mouseReleased(MouseEvent e) { //划线终点 if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK)) return; drawFlag=false; palette.repaint(); } @Override public void mousePressed(MouseEvent e) { //划线落点 if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK)) return; myAdd.removeAll(); drawFlag=false; state=new Point(e.getX(), e.getY()); } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { //右键快捷菜单显示 if(e.getModifiers()==MouseEvent.BUTTON3_MASK) pmenu.show(palette, e.getX(), e.getY()); } }); palette.addMouseMotionListener(new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { } //对鼠标拖动过程的处理,具有橡皮线功能 @Override public void mouseDragged(MouseEvent e) { if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK)) return; if(DRAETYPE==DRAECURVE){ end=new Point(e.getX(), e.getY()); mySet.add(new MyGeaph(state, end, DRAETYPE, DRAECOLOR)); state=new Point(e.getX(), e.getY()); }else{ if(!drawFlag){ drawFlag=true; }else{ mySet.remove(mySet.size()-1); } end=new Point(e.getX(), e.getY()); mySet.add(new MyGeaph(state, end, DRAETYPE, DRAECOLOR)); } palette.repaint(); } }); setVisible(true); } /* * 绘画面板 */ private class JDrawPanel extends JPanel { @Override public void paint(Graphics g) { super.paint(g); for (int i = 0; i < mySet.size(); i++) { MyGeaph geaph=(MyGeaph)mySet.get(i); g.setColor(geaph.color); if(geaph.drawType==DRAELINE) g.drawLine(geaph.state.x, geaph.state.y, geaph.end.x, geaph.end.y); else if(geaph.drawType==DRAECURVE) g.drawLine(geaph.state.x, geaph.state.y, geaph.end.x, geaph.end.y); else if(geaph.drawType==DRAERECTANGLE){ MyGeaph ge=change(geaph); g.drawRect(ge.state.x, ge.state.y, width(geaph), height(geaph)); } else if(geaph.drawType==DRAECIRCLE){ MyGeaph ge=change(geaph); g.drawOval(ge.state.x, ge.state.y, width(geaph), height(geaph)); } } } /* * 使得绘画正确,数据合理,防止起点终点不一致 */ private MyGeaph change(MyGeaph geaph) { Point state=new Point(); Point end=new Point(); if(geaph.state.x<geaph.end.x){ state.x=geaph.state.x; end.x=geaph.end.x; }else{ state.x=geaph.end.x; end.x=geaph.state.x; } if(geaph.state.y<geaph.end.y){ state.y=geaph.state.y; end.y=geaph.end.y; }else{ state.y=geaph.end.y; end.y=geaph.state.y; } return new MyGeaph(state, end, geaph.drawType, geaph.color); } private int height(MyGeaph geaph) { return Math.abs(geaph.end.y-geaph.state.y); } private int width(MyGeaph geaph) { return Math.abs(geaph.end.x-geaph.state.x); } } private class MyGeaph{ private Point state,end; private int drawType; private Color color; public MyGeaph(Point state, Point end, int drawType, Color color) { this.state = state; this.end = end; this.drawType = drawType; this.color = color; } } public static void main(String[] args) { new MyDraw(); } }
相关文章推荐
- 解决struts2过滤器冲突的简单方法
- eclipse突然报了com/genuitec/eclipse/j2eedt/core/J2EEProjectUtil 错误
- 将struts2的action交给spring管理及注意事项
- 写好Java代码的30条经验总结
- 二叉树中和为某一值得路径java
- [转]Spring3核心技术之事务管理机制
- JAVA中float与double的区别
- java学习日记——super关键字
- java 等额本金等额本息工具类
- [转]Spring的事务管理难点剖析(1):DAO和事务管理的牵绊
- Spring 中使用Properties文件
- Android【SDK目录结构】、【源码sources目录结构】、【如何在Eclipse中查看源码】
- java小小工具第一弹 音乐播放器
- java synchronized详解
- strtus2 web资源获取
- Java开发学习日记2-ADT安装失败的解决方法
- eclipse新建Sevlet报错的两种解决方法
- 【JAVA知识】集合框架
- Java 中重载与复写的区别、super与this的比较
- spring四种依赖注入方式