一起来画画

Posted shoulinniao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起来画画相关的知识,希望对你有一定的参考价值。

知识点:

  1. JFrame窗体类关键属性、方法和事件的应用
  2. Canvas画板类的关键方法和事件的应用
  3. 窗体菜单栏的创建和层级关系
  4. 工具栏、按钮的配合使用
  5. 鼠标点击、移动事件的使用
  6. AWT绘图方法的使用

Swing组件:

  • JFrame窗体类
  • JWindow无边框窗体类
  • JButton窗体类
  • JToggleButton按钮类
  • JMenuBar菜单栏类
  • JMenu菜单类
  • JMenuItem菜单项类

Swing事件监听:

  • 鼠标点击
  • 鼠标拖曳

Java技术:

  • Graphics2D绘图类
  • Java继承
  • 主类、主方法概念
  • File文件类
  • Image图片类
  • Ellipse2D圆形图形类
  • Rectangle2D方形图形类

 1.创建项目和导入资源

在Package Explorer的Other Projects,右键-New-Other-Java Project-next-(输入项目名:一起来画画)Finish;

在项目名上,右键-New-Folder-(选择文件夹:一起来画画,在Folder name输入:lib)Finish;

将外部包DrawUtil.mr.jar复制到lib里,然后在项目名上,右键-Build Path-Configure Build Path-Libraries-Add JARs...-选中"一起来画画/lib/DrawUtil.mr.jar"-OK;

2.编码

技术图片
  1 package com.mr.draw;
  2 
  3 import javax.swing.JFrame;
  4 
  5 import java.awt.Color;
  6 import java.awt.Graphics;
  7 import java.awt.Graphics2D;
  8 import java.awt.image.BufferedImage;
  9 
 10 import java.awt.event.MouseAdapter;
 11 import java.awt.event.MouseEvent;
 12 import java.awt.event.MouseMotionAdapter;
 13 
 14 import java.awt.BorderLayout;
 15 import javax.swing.ButtonGroup;
 16 import javax.swing.JButton;//按钮类
 17 import javax.swing.JToggleButton;///画线类
 18 import javax.swing.JToolBar;//工具栏类
 19 
 20 import java.awt.BasicStroke;
 21 import java.awt.event.ActionEvent;
 22 import java.awt.event.ActionListener;//调整画笔粗细
 23 
 24 import javax.swing.JColorChooser;//实现添加颜色功能
 25 
 26 import java.awt.geom.Ellipse2D;
 27 import java.awt.geom.Rectangle2D;
 28 import com.mr.util.FrameGetShape;
 29 import com.mr.util.ShapeWindow;
 30 import com.mr.util.Shapes; ///实现绘制图形功能
 31 
 32 import com.mr.util.DrawImageUtil;//实现图片保存功能
 33 
 34 import javax.swing.JMenu;
 35 import javax.swing.JMenuBar;
 36 import javax.swing.JMenuItem;//实现 添加菜单栏
 37 
 38 import java.awt.AlphaComposite;
 39 import java.awt.Font;
 40 import javax.swing.JOptionPane;//实现添加水印,为自己作品署名
 41 
 42 import java.awt.Image;
 43 import java.awt.Point;
 44 import java.awt.Toolkit;//工具箱
 45 import java.awt.Cursor;//光标,实现更改鼠标图标功能
 46 import javax.swing.ImageIcon;  
 47 
 48 //画图主窗体
 49 public class DrawPictureFrame extends JFrame implements FrameGetShape//继承窗体类,实现绘制图形的接口
 50     //创建一个8位BGR颜色分量的图像
 51     BufferedImage image = new BufferedImage(570,390,BufferedImage.TYPE_3BYTE_BGR);
 52     Graphics gs = image.getGraphics();
 53     Graphics2D g = (Graphics2D)gs;
 54     DrawPictureCanvas canvas = new DrawPictureCanvas();        //创建画布对象
 55     Color foreColor = Color.red;                            //前景色
 56     Color backgroundColor = Color.green;                    //背景色
 57     
 58     int x=-1;
 59     int y=-1;//上一次鼠标绘制点的横纵坐标
 60     boolean rubber=false;//橡皮识别变量
 61     
 62     private JToolBar toolBar;//工具栏目
 63     private JButton eraserButton;
 64     private JToggleButton strokeButton1;
 65     private JToggleButton strokeButton2;
 66     private JToggleButton strokeButton3;//细中粗按钮
 67     private JButton backgroundButton;
 68     private JButton foregroundButton;
 69     private JButton clearButton;
 70     private JButton saveButton;
 71     private JButton shapeButton;//图形按钮
 72     boolean drawShape = false;
 73     Shapes shape;
 74     private JMenuItem strokeMenuItem1;
 75     private JMenuItem strokeMenuItem2;
 76     private JMenuItem strokeMenuItem3;
 77     private JMenuItem clearMenuItem;
 78     private JMenuItem foregroundMenuItem;
 79     private JMenuItem backgroundMenuItem;
 80     private JMenuItem eraserMenuItem;
 81     private JMenuItem exitMenuItem;//退出菜单
 82     private JMenuItem saveMenuItem;
 83     private JMenuItem shuiyinMenuItem;//水印菜单
 84     private String shuiyin = "";//水印字符内容
 85     private PictureWindow picWindow;//简笔画展示窗体
 86     private JButton showPicButton;//展开简笔画按钮
 87     
 88     
 89     public DrawPictureFrame() 
 90     
 91         setResizable(false);                                 // 窗体大小不能改变
 92         //setTitle("画图程序");
 93         setTitle("画图程序(水印内容:[" + shuiyin + "] )" );
 94         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // 窗体关闭则立即停止程序
 95         setBounds(500, 100, 574, 460);                         // 设置窗口的位置和宽高
 96         
 97         init();//组件初始化
 98         addListener();//添加组件监听
 99     
100     
101     private void init()
102     
103         g.setColor(backgroundColor);//用前景色设置绘图对象的颜色
104         g.fillRect(0, 0, 570, 390);//用背景色填充整个画布,第一个0和570表示位置从0开始到57
105         g.setColor(foreColor);//用前景色设置绘图对象的颜色
106         canvas.setImage(image);//设置画布的图像
107         getContentPane().add(canvas);//将画布添加到窗体容器默认布局中的中部位置
108         
109         toolBar = new JToolBar();//初始化工具栏
110         toolBar.setFloatable(false);//工具栏固定
111         getContentPane().add(toolBar,BorderLayout.NORTH);//将工具栏添加到窗体最北位置
112         
113         //showPicButton = new JButton("展开简笔画");
114         showPicButton = new JButton();
115         showPicButton.setToolTipText("展开简笔画");
116         showPicButton.setIcon( new ImageIcon("src/img/icon/展开.png") );//需要导入ImageIcon
117         toolBar.add(showPicButton);
118         
119         saveButton = new JButton("保存");
120         toolBar.add(saveButton);
121         toolBar.addSeparator();//添加工具栏
122         strokeButton1 = new JToggleButton("细线");
123         strokeButton1.setSelected(true);//细线按钮处于被选中状态
124         toolBar.add(strokeButton1);
125         
126         strokeButton2 = new JToggleButton("粗线");
127         toolBar.add(strokeButton2);
128         
129         strokeButton3 = new JToggleButton("较粗");
130         toolBar.add(strokeButton3);
131         toolBar.addSeparator();
132         ButtonGroup strokeGroup = new ButtonGroup();//画笔粗细按钮组,保证同时只有一个被选中
133         strokeGroup.add(strokeButton1);
134         strokeGroup.add(strokeButton2);
135         strokeGroup.add(strokeButton3);
136         
137         backgroundButton = new JButton("背景颜色");
138         toolBar.add(backgroundButton);
139         foregroundButton = new JButton("前景颜色");
140         toolBar.add(foregroundButton);
141         toolBar.addSeparator();
142         
143         shapeButton = new JButton("图形");
144         toolBar.add(shapeButton);
145         clearButton = new JButton("清除");
146         toolBar.add(clearButton);
147         eraserButton = new JButton("橡皮");
148         toolBar.add(eraserButton);
149         toolBar.addSeparator();
150         
151         JMenuBar menuBar = new JMenuBar();
152         setJMenuBar(menuBar);
153         
154         JMenu systemMenu = new JMenu("系统");
155         menuBar.add(systemMenu);
156         shuiyinMenuItem = new JMenuItem("设置水印");
157         systemMenu.add(shuiyinMenuItem);
158         saveMenuItem = new JMenuItem("保存");
159         systemMenu.add(saveMenuItem);
160         systemMenu.addSeparator();
161         exitMenuItem = new JMenuItem("退出");
162         systemMenu.add(exitMenuItem);
163         JMenu strokeMenu = new JMenu("线型");
164         menuBar.add(strokeMenu);
165         strokeMenuItem1 = new JMenuItem("细线");
166         strokeMenu.add(strokeMenuItem1);
167         strokeMenuItem2 = new JMenuItem("粗线");
168         strokeMenu.add(strokeMenuItem2);
169         strokeMenuItem3 = new JMenuItem("较线");
170         strokeMenu.add(strokeMenuItem3);
171         
172         JMenu colorMenu = new JMenu("颜色");
173         menuBar.add(colorMenu);
174         foregroundMenuItem = new JMenuItem("前景颜色");
175         colorMenu.add(foregroundMenuItem);
176         backgroundMenuItem = new JMenuItem("背景颜色");
177         colorMenu.add(backgroundMenuItem);
178         
179         JMenu editMenu = new JMenu("编辑");
180         menuBar.add(editMenu);
181         clearMenuItem = new JMenuItem("清除");
182         editMenu.add(clearMenuItem);
183         eraserMenuItem = new JMenuItem("橡皮");
184         editMenu.add(eraserMenuItem);
185         
186         picWindow = new PictureWindow(DrawPictureFrame.this);
187     
188     
189     //动作监听
190     private void addListener()
191     
192         canvas.addMouseMotionListener(new MouseMotionAdapter()
193         
194             public void mouseDragged( final MouseEvent e )//鼠标拖曳监听
195             
196                 if(x>0 && y>0)//如果x和y存在鼠标记录
197                 
198                     if(rubber)//如果是橡皮则画出背景色,相当于擦掉前景色
199                     
200                         g.setColor(backgroundColor);
201                         g.fillRect(x, y, 10, 10);
202                     
203                     else //否则画出
204                         g.drawLine(x,y,e.getX(),e.getY());
205                 
206                 x=e.getX();
207                 y=e.getY();//上一次鼠标绘制点的横纵坐标
208                 canvas.repaint();//更新画布
209             
210             public void mouseMoved(final MouseEvent arg0) 
211                 if(rubber)//如果使用橡皮
212                 
213                     Toolkit kit = Toolkit.getDefaultToolkit();//获得系统默认的组件工具包
214                     Image img = kit.createImage("src/img/icon/鼠标橡皮.png");//利用工具包获取图片
215                     Cursor c = kit.createCustomCursor(img,new Point(0,0),"clear");//参数为图片,光标热点和光标描述的字符串
216                     setCursor(c);//使用自定义光标
217                 
218                 else 
219                     setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));//不是橡皮则是画笔,则设置光标为十字形
220             
221         );
222         canvas.addMouseListener(new MouseAdapter() //鼠标点击监听
223             public void mouseReleased( final MouseEvent arg0 )//按键抬起时
224             
225                 x=-1;
226                 y=-1;//将上一次鼠标绘制点的横纵坐标恢复成-1
227                 //改成x=11,y=11???
228             
229             
230             public void mousePressed(MouseEvent e)//当按键按下时
231             
232                 if( drawShape )//如果此时鼠标画的是
233                 
234                     switch( shape.getType() )//判断图形种类
235                     
236                         case Shapes.YUAN:
237                             int yuanX = e.getX()-shape.getWidth()/2;
238                             int yuanY = e.getY()-shape.getHeigth()/2;
239                             /*
240                             System.out.println(e.getX()+"  "+e.getY());
241                             System.out.println(shape.getWidth()/2+"  "+shape.getHeigth()/2);
242                             System.out.println(yuanX+"  "+yuanY);*/
243                             //创建圆形图形,根据长宽可能是椭圆,指定坐标和宽高
244                             Ellipse2D yuan = new Ellipse2D.Double(yuanX,yuanY,shape.getWidth(),shape.getHeigth());
245                             g.draw(yuan);
246                             break;
247                         case Shapes.FANG:
248                             int fangX=e.getX()-shape.getWidth()/2;
249                             int fangY=e.getY()-shape.getHeigth()/2;
250                             Rectangle2D fang = new Rectangle2D.Double(fangX,fangY,shape.getWidth(),shape.getHeigth());
251                             g.draw(fang);
252                             break;
253                     
254                     canvas.repaint();
255                     drawShape = false;//画一个就不能画了
256                 
257             
258         );
259         
260         toolBar.addMouseMotionListener(new MouseMotionAdapter() //工具栏添加鼠标移动监听
261             public void mouseMoved(final MouseEvent arg0) //鼠标移动时,设置鼠标指针的形状为默认光标
262                 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
263             
264         );
265         
266         //调整画笔粗细
267         strokeButton1.addActionListener(new ActionListener() //细线按钮添加监听
268             public void actionPerformed(final ActionEvent arg0)//单击时
269                 //声明画笔的属性,粗细为1像素,线条末端无修饰,折线处呈尖角
270                 BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
271                 g.setStroke(bs);//画图工具使用此笔
272             
273         );
274         strokeButton2.addActionListener(new ActionListener() //中线按钮添加监听
275             public void actionPerformed(final ActionEvent arg0)//单击时
276                 //声明画笔的属性,中线为2像素,线条末端无修饰,折线处呈尖角
277                 BasicStroke bs = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
278                 g.setStroke(bs);//画图工具使用此笔
279             
280             
281         );
282         strokeButton3.addActionListener(new ActionListener() //粗线按钮添加监听
283             public void actionPerformed(final ActionEvent arg0)//单击时
284                 //声明画笔的属性,粗线为4像素,线条末端无修饰,折线处呈尖角
285                 BasicStroke bs = new BasicStroke(4,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
286                 g.setStroke(bs);//画图工具使用此笔
287             
288         );
289         
290         //实现颜色添加功能
291         backgroundButton.addActionListener( new ActionListener() 
292             public void actionPerformed( final ActionEvent arg0 )
293                 //打开选择颜色对话框,参数依次是:符窗体、标题、默认选中的颜色(青色)
294                 Color bgColor = JColorChooser.showDialog(DrawPictureFrame.this, "选择颜色对话框", Color.CYAN);
295                 if ( bgColor !=null )///选中的颜色不是空的
296                     backgroundColor = bgColor;//则将选中的颜色赋给背景色
297                 backgroundButton.setBackground(backgroundColor);
298                 g.setColor(backgroundColor);
299                 g.fillRect(0, 0, 570, 390);//画一个背景颜色的方形填满整个画布
300                 g.setColor(foreColor);
301                 canvas.repaint();//更新画布
302             
303         );
304         foregroundButton.addActionListener(new ActionListener() 
305             public void actionPerformed(final ActionEvent arg0)
306             
307                 Color fColor = JColorChooser.showDialog(DrawPictureFrame.this, "选择颜色对话框", Color.CYAN);
308                 if(fColor != null)
309                     foreColor = fColor;
310                 foregroundButton.setForeground(foreColor);
311                 g.setColor(foreColor);
312             
313             
314         );
315         
316         //清除按钮和橡皮按钮
317         clearButton.addActionListener(new ActionListener() 
318             public void actionPerformed( final ActionEvent arg0 ) 
319                 g.setColor(backgroundColor);
320                 g.fillRect(0, 0, 570, 390);//用背景色填充以达到清除效果,然后画笔换成前景色,继续作画
321                 g.setColor(foreColor);
322                 canvas.repaint();//更新画布
323             
324         );    
325         eraserButton.addActionListener(new ActionListener() 
326             public void actionPerformed(final ActionEvent arg0)
327             
328                 if( eraserButton.getText().equals("橡皮") )
329                 
330                     rubber = true;
331                     eraserButton.setText("画图");
332                 
333                 else
334                 
335                     rubber = false;
336                     eraserButton.setText("橡皮");
337                     g.setColor(foreColor);
338                     
339                 
340             
341         );
342         
343         
344         //图形绘制按钮
345         shapeButton.addActionListener(new ActionListener() 
346             public void actionPerformed(ActionEvent e)//单击时
347             
348                 //创建图形选择组件
349                 ShapeWindow shapeWindow = new ShapeWindow(DrawPictureFrame.this);
350                 int shapeButtonWidth = shapeButton.getWidth();
351                 int shapeWindowWidth = shapeWindow.getWidth();
352                 int shapeButtonX = shapeButton.getX();
353                 int shapeButtonY = shapeButton.getY();
354                 int shapeWindowX = getX() - shapeButtonX - ( shapeWindowWidth-shapeButtonWidth )/2;
355                 int shapeWindowY = getY() - shapeButtonY + 80;
356                 shapeWindow.setLocation(shapeWindowX,shapeWindowY);
357                 shapeWindow.setVisible(true);//图形组件可见,如果是false点击图形啥都没有
358             
359             
360         );
361         
362         //保存按钮实现保存功能
363         saveButton.addActionListener(new ActionListener() 
364             public void actionPerformed(final ActionEvent arg0) //单击时
365                 addWatermark();//添加水印
366                 DrawImageUtil.saveImage(DrawPictureFrame.this,image );//打印图片
367             
368             
369         );
370         
371         exitMenuItem.addActionListener(new ActionListener() ///退出菜单动作监听
372             public void actionPerformed(final ActionEvent e)///单击时程序退出
373             
374                 System.exit(0);
375             
376         );
377         
378         eraserMenuItem.addActionListener(new ActionListener() 
379             public void actionPerformed(final ActionEvent e) 
380                 if( eraserMenuItem.getText().contentEquals("橡皮") ) 
381                     rubber = true;
382                     eraserMenuItem.setText("画图");
383                     eraserButton.setText("画图");
384                 
385                 else
386                 
387                     rubber = false;
388                     eraserMenuItem.setText("橡皮");
389                     eraserButton.setText("橡皮");
390                     g.setColor(foreColor);
391                 
392             
393         );
394         
395         clearMenuItem.addActionListener(new ActionListener() 
396             public void actionPerformed(final ActionEvent e) 
397                 g.setColor(backgroundColor);
398                 g.fillRect(0, 0, 570, 390);
399                 g.setColor(foreColor);
400                 canvas.repaint();
401                 
402             
403         );
404         
405         strokeMenuItem1.addActionListener(new ActionListener() //细线菜单添加动作监听
406             public void actionPerformed(final ActionEvent e) 
407                 //像素为1,线条末端无修饰,折线处呈尖角
408                 BasicStroke bs = new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
409                 g.setStroke(bs);//画图工具使用此笔
410                 strokeButton1.setSelected(true);//细线按钮设为选中状态
411             
412         );
413         
414         strokeMenuItem2.addActionListener(new ActionListener() 
415             public void actionPerformed(final ActionEvent e) 
416                 BasicStroke bs = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
417                 g.setStroke(bs);
418                 strokeButton2.setSelected(true);
419             
420         );
421         
422         strokeMenuItem3.addActionListener(new ActionListener() 
423             public void actionPerformed(final ActionEvent e) 
424                 BasicStroke bs = new BasicStroke(4,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
425                 g.setStroke(bs);
426                 strokeButton3.setSelected(true);
427             
428         );
429         
430         foregroundMenuItem.addActionListener(new ActionListener() 
431             public void actionPerformed(final ActionEvent e) 
432                 Color fColor = JColorChooser.showDialog(DrawPictureFrame.this, "选择颜色对话框", Color.CYAN);
433                 if( fColor != null )
434                     foreColor = fColor;
435                 foregroundButton.setForeground(foreColor);
436                 g.setColor(foreColor);
437             
438         );
439         
440         backgroundMenuItem.addActionListener(new ActionListener() 
441             public void actionPerformed(final ActionEvent e) 
442                 Color bgColor = JColorChooser.showDialog(DrawPictureFrame.this, "选择颜色对话框", Color.CYAN);
443                 if( bgColor != null )
444                     backgroundColor = bgColor;
445                 backgroundButton.setBackground(backgroundColor);
446                 g.setColor(backgroundColor);
447                 g.fillRect(0, 0, 570, 390);
448                 g.setColor(foreColor);
449                 canvas.repaint();
450             
451         );
452         
453         saveMenuItem.addActionListener(new ActionListener() 
454             public void actionPerformed(ActionEvent e) 
455                 addWatermark();//添加水印
456                 DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片
457             
458         );
459         
460         shuiyinMenuItem.addActionListener(new ActionListener() 
461             public void actionPerformed(ActionEvent e) 
462                 //输入对话框
463                 System.out.println("facai1");
464                 shuiyin = JOptionPane.showInputDialog(DrawPictureFrame.this,"你想添加什么水印?");
465                 System.out.println("facai2");
466                 if ( null == shuiyin)
467                     shuiyin="";
468                 else 
469                     setTitle("画图程序(水印内容:[ " + shuiyin + " ])");//修改窗体标题
470                 System.out.println("facai3");
471             
472         );
473         
474         showPicButton.addActionListener(new ActionListener() 
475             public void actionPerformed(ActionEvent e) 
476                 boolean isVisible = picWindow.isVisible();
477                 if(isVisible) 
478                     showPicButton.setText("展开简笔画");
479                     picWindow.setVisible(false);
480                 
481                 else 
482                 
483                     showPicButton.setText("隐藏简笔画");
484                     //重新指定简笔画展示窗体的显示位置
485                     //横坐标 = 主窗体横坐标 - 简笔画窗体宽度 - 5; 纵坐标 = 主窗体纵坐标
486                     picWindow.setLocation(getX()-picWindow.getWidth()-5,getY());
487                     picWindow.setVisible(true);
488                 
489             
490         );
491         
492         
493     
494     
495     
496     //添加水印
497     private void addWatermark() 
498         if( !"".equals(shuiyin.trim()) )///shuiyin变量删除头尾空白字符后 不等于空 
499         
500             g.rotate(Math.toRadians(-30));//将图片旋转-30弧度
501             Font font = new Font("楷体",Font.BOLD,72);//设置字体
502             g.setFont(font);
503             g.setColor(Color.GRAY);
504             AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);//设置透明效果
505             g.setComposite(alpha);
506             g.drawString(shuiyin, 75, 400);//绘制文字
507             canvas.repaint();
508             g.rotate(Math.toRadians(30));//将旋转的图片再旋转回来
509             alpha = AlphaComposite.SrcOver.derive(1f);//不透明效果
510             g.setComposite(alpha);//使用不透明效果
511             g.setColor(foreColor);//画笔恢复之前颜色
512         
513     
514     
515     //恢复展开简笔画按钮的文本内容,此方法供简笔画面板的"隐藏"按钮调用
516     public void initShowPicButton() 
517         showPicButton.setText("展开简笔画");
518     
519     
520     
521     //FrameGetShape接口实现类,用于获得图形空间返回的被选中的图形
522     public void getShape(Shapes shape)
523     
524         this.shape=shape;//将返回的图形对象赋给类的全局变量
525         drawShape = true;//画图形标识变量为true,说明现在鼠标画的是图形,而不是线条
526     
527     
528     
529     
530     
531 
532     public static void main(String[] args) 
533     
534         DrawPictureFrame frame = new DrawPictureFrame();//创建窗体对象
535         frame.setVisible(true);//让窗体可见
536     
537 
538 
DrawPictureFrame.java
技术图片
 1 package com.mr.draw;
 2 
 3 import java.awt.Canvas;
 4 import java.awt.Graphics;
 5 import java.awt.Image;
 6 
 7 
 8 public class DrawPictureCanvas extends Canvas
 9     private Image image = null;//创建画板中展示的图片对象
10     //设置画板中的图片
11     public void setImage( Image image)
12     
13         this.image = image;
14     
15     //重写,在画布上绘制图像
16     public void paint( Graphics g )
17     
18         g.drawImage( image,0,0,null );
19     
20     
21     //重写,解决屏幕闪烁问题
22     public void update( Graphics g )
23     
24         paint(g);
25     
26 
DrawPictureCanvas.java
技术图片
 1 package com.mr.draw;
 2 
 3 import java.awt.BorderLayout;
 4 import java.awt.Container;
 5 import java.awt.FlowLayout;
 6 import java.awt.Image;
 7 import java.awt.event.ActionEvent;
 8 import java.awt.event.ActionListener;
 9 import java.io.File;
10 import javax.swing.ImageIcon;
11 import javax.swing.JButton;
12 import javax.swing.JPanel;//面板
13 import javax.swing.JWindow;
14 import com.mr.util.BackgroundPanel;
15 
16 
17 
18 public class PictureWindow extends JWindow 
19     private JButton changeButton;
20     private JButton hiddenButton;
21     private BackgroundPanel centerPanel;
22     File list[];
23     int index;
24     DrawPictureFrame frame;
25     
26     //构造方法
27     public PictureWindow(DrawPictureFrame frame) 
28         this.frame = frame;//构造参数的值赋给父窗体
29         setSize(400,460);
30         init();
31         addListener();
32     
33     
34     private void init() 
35         Container c = getContentPane();
36         File dir = new File("src/img/picture");
37         list = dir.listFiles();
38         centerPanel = new BackgroundPanel(getListImage());
39         c.add(centerPanel,BorderLayout.CENTER);//背景面板放到主容器的中部
40         FlowLayout flow = new FlowLayout(FlowLayout.RIGHT);//右对齐流布局
41         flow.setHgap(20);//水平间隔20像素
42         JPanel southPanel = new JPanel();//创建南部面板
43         southPanel.setLayout(flow);//使用刚才建好的流布局
44         changeButton = new JButton("更换图片");
45         southPanel.add(changeButton);
46         hiddenButton = new JButton("隐藏");
47         southPanel.add(hiddenButton);
48         c.add(southPanel,BorderLayout.SOUTH);//南部面板放在主容器的南部
49     
50     
51     //添加监听
52     private void addListener() 
53         hiddenButton.addActionListener(new ActionListener() 
54             public void actionPerformed(ActionEvent e) 
55                 setVisible(false);//隐藏按钮点击时窗体不可见
56                 frame.initShowPicButton();
57             
58         );
59         changeButton.addActionListener(new ActionListener() 
60             public void actionPerformed(ActionEvent e) 
61                 centerPanel.setImage(getListImage());//更换图片按钮点击时背景面板重新载入图片
62             
63         );
64     
65     
66     private Image getListImage() 
67         String imgPath = list[index].getAbsolutePath();
68         ImageIcon image = new ImageIcon(imgPath);
69         index++;
70         if(index>=list.length)
71             index=0;
72         return image.getImage();
73     
74     
75 
PictureWindow.java

3.项目界面

技术图片

 

以上是关于一起来画画的主要内容,如果未能解决你的问题,请参考以下文章

是什么让人工智能突然开始画画了?

VTK学习之路——画画我的小苹果

在屏幕上可以随意写字画画的软件叫啥?

微信小程序项目实例——我有一支画笔(画画)

ios画画板

Daily Sketch | October ( 10.02~10.09 )