我的画图板2.0

xiaoxiao2021-02-27  342

     画图板的学习已经有半月之久了,今天做个小小的总结来回顾和熟练所学的知识。

说起画图板,第一直觉就是一个窗体上面有一块面板,然后周围有各种各样的工具以及颜色,点击工具选择颜色用鼠标在面板上按下、拖动、释放,就可以在面板上出现一个图形了。

按照这样的思路,一点点写出画图板。

//首先要创建一个Draw类的draw对象,在主函数里面对象调用方法这里创建一个方法为showUI();

//构造showUI()函数,直观的是看到的窗体,那么就建立一个窗体对象frame ,函数库里存在着窗体类,直接调用即可,但是一定要注意在最前面导入类的包名,接下来设置好窗体的大小、标题、位置以及窗体的布局 

      设置窗体的标题:setTitle()

      设置窗体的大小 :setSize()

      设置窗体的位置:setLocationRelativeTo()//设置窗体最基本的方法是setLocation()这里的setLocationRelativeTo()是指将窗体设置到屏幕的中间位置,参数用null

     设置窗体的布局时要先创建一个布局对象layout  然后在规范组件的摆放位置用setLayout( )

     //其实我们看到的画图板式是分区域的,也就是说它是一块一块的面板组成的,这里创建三块面板对象shape_panel、color_panel、draw_panel(形状区域,颜色区域,画图的区域)创建面板对象用Jpanel类

  面板对象建立好后,用之前同样的方法来设置面板的属性,设置好后一定要记得把面板添加到窗体中去用add()方法添加。

    前端UI设置完成后,就到了最核心也是最重要的一部分,就是添加监听,即当鼠标在窗体上操作时会触发什么样的事件,比如说点击颜色和画笔,拖动鼠标时,在面板上会发生什么相应的变化。

在这之前,要想一个问题,当我们点击画布要绘画时,也就是在画图的区域要触发什么样的事件呢,相比与其他的两块面板有什么的不同的区别呢??

//这里draw_panel要先获取一块画布,先定义一块画布Graphics g = null;接下来就要获取画布了,用g = draw_panel.getGraphics();

       获取完画布后,就开始添加监听,创建颜色按钮监听器、形状按钮监听器以及鼠标按钮监听器,在java里监听器的类是ActionLIstener,

      监听设置好后开始画图,画图遵循一些规则,比如四个坐标点确定一条直线。。。。。代码中体现。。。

      差不多完成了所有的操作,但是还要考虑一个重要的问题,怎么把我们所画的图保存下来?(这里只是的那个窗口最小化再打开时还保存着之前所画的图形),保存要对画图板进行重绘即用匿名内部类的方式来重写paint类代码如下:

JPanel draw_panel = new JPanel(){ //重写paint的方法 public void paint(Graphics g){ super.paint(g); for(int i=0;i<list.size();i=i+5){ //每次从list里取出5个值来保存坐标值和颜色 int x1=(int)list.get(i); int y1=(int)list.get(i+1); int x2=(int)list.get(i+2); int y2=(int)list.get(i+3); Color color=(Color)list.get(i+4); g.setColor(color);//重新设置颜色 g.drawLine(x1,y1,x2,y2);//重构直线

} } };

第二次写博客,总结能力还有待提高。画图板功能因能力有限,还不完整,以后再更。见谅!!!!

完整的代码如下:

<textarea readonly="readonly" name="Draw" class="java">  package xp_draw2; import java.awt.*; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JButton;  import javax.swing.JFrame;//跟界面相关的类都在javax.swing包中 import javax.swing.JPanel; public class Draw{ //定义画布 Graphics g = null; Graphics2D g2 = null; //坐标 int x1,y1,x2,y2,x0,y0,x3,y3; //标记 String text; ArrayList list=new ArrayList (); Color color; //主方法 程序入口 public static void main(String[] args){ //创建Draw的对象 Draw draw = new Draw(); //显示界面 draw.showUI(); } //显示画图板界面的方法 public void showUI(){ //创建窗体的对象(JFrame) JFrame frame = new JFrame(); //设置窗体的大小 frame.setSize(600,500); //设置窗体的标题 frame.setTitle("我的第一个画图板"); //设置窗体的位置 frame.setLocationRelativeTo(null); //设置当窗体关闭时 程序退出 frame.setDefaultCloseOperation(3); //创建线性布局对象(FlowLayout) FlowLayout layout = new FlowLayout(); //设置窗体的布局(规范组件摆放的位置) frame.setLayout(layout); //创建3块面板对象(JPanel) JPanel shape_panel = new JPanel(); JPanel color_panel = new JPanel(); JPanel draw_panel = new JPanel(){ //重写paint的方法 public void paint(Graphics g){ super.paint(g); for(int i=0;i<list.size();i=i+5){ //每次从list里取出5个值 int x1=(int)list.get(i); int y1=(int)list.get(i+1); int x2=(int)list.get(i+2); int y2=(int)list.get(i+3); Color color=(Color)list.get(i+4); g.setColor(color); g.drawLine(x1,y1,x2,y2); } } }; //设置面板的背景颜色 大小 shape_panel.setBackground(Color.orange); color_panel.setBackground(Color.pink); draw_panel.setBackground(Color.white); shape_panel.setPreferredSize(new Dimension(100,350)); draw_panel.setPreferredSize(new Dimension(450,350)); color_panel.setPreferredSize(new Dimension(580,90)); //设置shape_panel的布局 shape_panel.setLayout(new FlowLayout(1,20,10)); //将面板添加到窗体 frame.add(shape_panel); frame.add(draw_panel); frame.add(color_panel); //创建颜色按钮的监听器对象 //创建形状按钮的监听器对象 ActionListener color_listener = new ActionListener(){ public void actionPerformed(ActionEvent e){ //获取被点击的按钮对象 JButton button = (JButton)e.getSource();//获取事件源(按钮)Object //获取按钮对象的背景颜色 color = button.getBackground(); //设置画布的颜色 g.setColor(color); } }; //创建颜色数组 保存颜色按钮的背景颜色 Color[] colors = {Color.red,Color.blue,Color.green,Color.black, Color.white,Color.pink,Color.gray,Color.yellow, Color.orange,new Color(100,200,100)}; //创建10个颜色按钮对象 for(int i=0;i<10;i++){ JButton color_button = new JButton(); color_button.setBackground(colors[i]); color_button.addActionListener(color_listener); color_button.setPreferredSize(new Dimension(40,20)); color_panel.add(color_button); } //创建形状按钮的监听器对象 ActionListener shape_listener = new ActionListener(){ public void actionPerformed(ActionEvent e){ //获取被点击按钮的标记 text = e.getActionCommand(); } }; //创建16个形状按钮对象 for(int i=1;i<=16;i++){ JButton shape_button = new JButton(); ImageIcon icon = new ImageIcon("image//"+i+"-1.png"); shape_button.setIcon(icon); shape_button.addActionListener(shape_listener); shape_button.setActionCommand(i+"");//设置按钮的标记 shape_button.setPreferredSize(new Dimension(25,25)); shape_panel.add(shape_button); } //设置窗体可见 frame.setVisible(true); //获取draw_panel的画布 g = draw_panel.getGraphics(); g2=(Graphics2D)g; //创建鼠标监听器对象(方便) MouseAdapter mouse_listener = new MouseAdapter(){ public void mousePressed(MouseEvent e){ x1 = e.getX(); y1 = e.getY(); list.add(x1); list.add(y1); } public void mouseReleased(MouseEvent e){ x2 = e.getX(); y2 = e.getY(); list.add(x2); list.add(y2); list.add(color); //画图 if(text.equals("1")){} if(text.equals("2")){} if(text.equals("3")){ //橡皮 Graphics2D g2=(Graphics2D)g; g2.setStroke(new BasicStroke(35));  g.setColor(Color.white); x2 = e.getX(); y2 = e.getY(); g.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; } if(text.equals("4")){} if(text.equals("5")){} if(text.equals("6")){} if(text.equals("7")){} if(text.equals("8")){ //刷子 g2.setStroke(new BasicStroke(5)); x2 = e.getX(); y2 = e.getY(); g.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; } if(text.equals("9")){ Graphics2D g2=(Graphics2D)g; g2.setStroke(new BasicStroke(5));  x3=e.getX(); y3=e.getY(); Random rand=new Random(); //使用循环,来画15个小点 for(int i=0;i<=15;i++){ //在20个像素点的范围内随机取一个值 int tempx=rand.nextInt(20); int tempy=rand.nextInt(20); g.drawLine(tempx+x3, tempy+y3, tempx+x3, tempy+y3); } } if(text.equals("10")){} if(text.equals("11")){ g2.setStroke(new BasicStroke(1)); g.drawLine(x1,y1,x2,y2); } if(text.equals("12")){} if(text.equals("13")){ g2.setStroke(new BasicStroke(1)); g.drawRect(x1,y1,x2-x1,y2-y1); } if(text.equals("14")){ x0=x1; y0=y1; } if(text.equals("15")){ g2.setStroke(new BasicStroke(1)); g.drawOval(x1,y1,x2-x1,y2-y1); } if(text.equals("16")){ g2.setStroke(new BasicStroke(1)); g.drawRoundRect(x1,y1,x2-x1,y2-y1,10,10); } } public void mouseDragged(MouseEvent e){ if("7".equals(text)) { g2.setStroke(new BasicStroke(1)); x2 = e.getX(); y2 = e.getY(); g.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; } } }; draw_panel.addMouseListener(mouse_listener); draw_panel.addMouseMotionListener(mouse_listener); } } </textarea>

转载请注明原文地址: https://www.6miu.com/read-2795.html

最新回复(0)