画板 Java实现

画板 Java实现

也是刚刚从邮箱里发现的古董。。。



我的代码:

  1  //  ubuntu  windows endl
  2 
  3  import  java.awt. * ;
  4  import  java.awt.event. * ;
  5  import  java.awt.image. * ;
  6  import  java.io. * ;
  7  import  javax.swing. * ;
  8  import  javax.imageio. * ;
  9 
 10  class  PainterCanvas  extends  Canvas {
 11 
 12           public  PainterCanvas( Color foregroundColor,  int  initPaintType,  float  lineWidth,  float  [] dashArray,  float  dashPhase, Dimension size ) {
 13                  setColor( foregroundColor );
 14                  setBackground( COLOR_BACK );
 15                  paintType  =  LINE;
 16                  setPaintType( initPaintType );
 17                  paintStroke  =   new  BasicStroke();
 18                  setLineWidth( lineWidth );
 19                  setLineDash( dashArray, dashPhase );
 20                  setBufferedDimension( size );
 21                  startX  =  startY  =  endX  =  endY  =   0 ;
 22                  drawBuffer  =   false ;
 23                  pressed  =   false
 24                  setCursor( Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR ) );
 25                  addMouseListener(  new  
 26                          MouseAdapter() {
 27                                   public   void  mousePressed( MouseEvent me ) {
 28                                           if  (  !  pressed ) {
 29                                                  startX   =  me.getX();
 30                                                  startY   =  me.getY();
 31                                                  pressed  =   true ;
 32                                          }
 33                                  }
 34                                   public   void  mouseReleased( MouseEvent me ) {
 35                                           if  ( pressed ) {
 36                                                  endX  =  me.getX();
 37                                                  endY  =  me.getY();
 38                                                  pressed  =   false ;
 39                                                  drawBuffer  =   true ;
 40                                                  repaint();
 41                                          }
 42                                  }
 43                          }
 44                  );
 45                  addMouseMotionListener(  new  MouseMotionAdapter() {
 46                           public   void  mouseDragged( MouseEvent me ) {
 47                                  endX  =  me.getX();
 48                                  endY  =  me.getY();
 49                                  repaint();
 50                          }
 51                  } );
 52          }
 53 
 54           public   void  setPaintType(  int  t ) {
 55                   if  ( ( t  ==  LINE )   ||  ( t  ==  TRIA )  ||  ( t  ==  OVAL )  ||  ( t  ==  RECT ) ) {
 56                          paintType  =  t;
 57                  }
 58          }
 59 
 60           public   void  setColor( Color col ) {
 61                  colorFore  =  col;
 62          }
 63 
 64           public   void  setLineWidth(  float  lineWidth ) {
 65                   if  ( lineWidth  >   0.0f  ) {
 66                          paintStroke  =   new  BasicStroke( lineWidth, paintStroke.getEndCap(), 
 67                                                          paintStroke.getLineJoin(), paintStroke.getMiterLimit(), 
 68                                                          paintStroke.getDashArray(), paintStroke.getDashPhase() );
 69                  }
 70          }
 71 
 72           public   void  setLineDash(  float  [] dashArray,  float  dashPhase ) {
 73                  paintStroke  =   new  BasicStroke( paintStroke.getLineWidth(), paintStroke.getEndCap(), 
 74                                                  paintStroke.getLineJoin(), paintStroke.getMiterLimit(), 
 75                                                  dashArray, dashPhase );
 76          }
 77 
 78           public   void  setBufferedDimension( Dimension size ) {
 79                  setSize( size );
 80                  dimSize  =  size;
 81                  img      =   new  BufferedImage( dimSize.width, dimSize.height, BufferedImage.TYPE_4BYTE_ABGR );
 82                  graImg   =  img.createGraphics();
 83                  graImg.setColor( COLOR_BACK );
 84                  graImg.fillRect(  0 0 , dimSize.width, dimSize.height );
 85          }
 86 
 87           public   void  setBufferedImage( BufferedImage bufImg ) {
 88                  dimSize.width   =  bufImg.getWidth();
 89                  dimSize.height  =  bufImg.getHeight();
 90                  setSize( dimSize );
 91                  img     =  bufImg;
 92                  graImg  =  img.createGraphics();
 93          }
 94 
 95           public  Color getColor() {
 96                   return  colorFore;
 97          }
 98 
 99           public  BufferedImage getBufferedImage() {
100                   return  img;
101          }
102 
103           public   void  paint( Graphics g ) {
104                  g.drawImage( img,  0 0 , dimSize.width, dimSize.height,  this  );
105                  paintUpdate( g );
106          }
107          
108           public   void  update( Graphics g ) {
109                  g.drawImage( img,  0 0 , dimSize.width, dimSize.height,  this  );
110                  paintUpdate( g );
111          }
112 
113           public   void  paintUpdate( Graphics gra ) {
114                  Graphics2D g  =  (Graphics2D)gra;
115                  g.setColor( colorFore );
116                  g.setStroke( paintStroke );
117                  graImg.setColor( colorFore );
118                  graImg.setStroke( paintStroke );
119                   int  x  =  Math.min( startX, endX );
120                   int  y  =  Math.min( startY, endY );
121                   int  w  =  startX  +  endX  -  x  -  x;
122                   int  h  =  startY  +  endY  -  y  -  y;
123                   switch  ( paintType ) {
124                           case  LINE :
125                                  g.drawLine( startX, startY, endX, endY );
126                                   if  ( drawBuffer ) {
127                                          graImg.drawLine( startX, startY, endX, endY );
128                                  }
129                                   break ;
130                           case  TRIA :
131                                  g.drawPolygon(  new   int []{ startX, x, endX },  new   int []{ startY, ( startY  +  endY )  /   2 , endY },  3  );
132                                   if  ( drawBuffer ) {
133                                          graImg.drawPolygon(  new   int []{ startX, x, endX },  new   int []{ startY, ( startY  +  endY )  /   2 , endY },  3  );
134                                  }
135                                   break ;
136                           case  OVAL :
137                                  g.drawOval( x, y, w, h );
138                                   if  ( drawBuffer ) {
139                                          graImg.drawOval( x, y, w, h );
140                                  }
141                                   break ;
142                           case  RECT :
143                                  g.drawRect( x, y, w, h );
144                                   if  ( drawBuffer ) {
145                                          graImg.drawRect( x, y, w, h );
146                                  }
147                                   break ;
148                  }
149                  drawBuffer  =   false ;
150          }
151 
152           private   int              startX, startY, endX, endY, paintType;
153           private  Color           colorFore;
154           private   boolean          pressed, drawBuffer;
155           private  BasicStroke     paintStroke;
156           private  Graphics2D      graImg;
157           private  BufferedImage   img;
158           private  Dimension       dimSize;
159 
160           private   static   final  Color COLOR_BACK  =  Color.WHITE;
161           public    static   final   int    LINE  =   0 , TRIA  =   1 , OVAL  =   2 , RECT  =   3 ;
162 
163  }
164 
165 
166  // ------------------------------------------------------------------------------------------
167 
168 
169  class  PainterWin  extends  Frame  implements  ActionListener, ItemListener {
170 
171           public  PainterWin() {
172                   super " 画板 --- 赵杰 "  );
173                  initFrame();
174                  initMenu();
175                  initTool();
176                  initCanvas();
177                  setVisible(  true  );
178                  validate();
179          }
180 
181           public   void  actionPerformed( ActionEvent ae ) {
182                  Object obj  =  ae.getSource();
183                   if  ( obj  ==  menuNew ) {
184                          onMenuNew();
185                  }
186                   else   if  ( obj  ==  menuOpen ) {
187                          onMenuOpen();
188                  }
189                   else   if  ( obj  ==  menuSave ) {
190                          onMenuSave();
191                  }
192                   else   if  ( obj  ==  menuExit ) {
193                          onMenuExit();
194                  }
195                   else   if  ( obj  ==  butLine ) {
196 
197                          canvas.setPaintType( PainterCanvas.LINE );
198                  }
199                   else   if  ( obj  ==  butTria ) {
200                          canvas.setPaintType( PainterCanvas.TRIA );
201                  }
202                   else   if  ( obj  ==  butOval ) {
203                          canvas.setPaintType( PainterCanvas.OVAL );
204                  }
205                   else   if  ( obj  ==  butRect ) {
206                          canvas.setPaintType( PainterCanvas.RECT );
207                  }
208          }
209 
210           public   void  itemStateChanged( ItemEvent ie ) {
211                  Object obj  =  ie.getSource();
212                   if  ( obj  ==  choLineType ) {
213                          onChoiceLineType();
214                  }
215                   else   if  ( obj  ==  choLineWidth ) {
216                          onChoiceLineWidth();
217                  }
218                   else   if  ( obj  ==  choColor ) {
219                          onChoiceColor();
220                  }
221          }
222 
223           private   void  initFrame() {
224                  setBounds(  300 200 600 500  );
225                  addWindowListener(  new  WindowAdapter() {
226                                                   public   void  windowClosing( WindowEvent we ) {
227                                                          onExit();
228                                                  }
229                                         }
230                  );
231                  setLayout(  new  BorderLayout() );  //  default
232          }
233 
234           private  MenuItem newMenuItem( Menu menu, String label, MenuShortcut sc ) {
235                  MenuItem item  =   new  MenuItem( label, sc );
236                  item.addActionListener(  this  );
237                  menu.add( item );
238                   return  item;
239          }
240 
241           private   void  initMenu() {
242                  MenuBar menuBar  =   new  MenuBar();
243                  Menu    menu     =   new  Menu(  " 文件 "  );
244                  menuNew     =  newMenuItem( menu,  " 新建 " new  MenuShortcut( KeyEvent.VK_N ) );
245                  menuOpen    =  newMenuItem( menu,  " 打开 " new  MenuShortcut( KeyEvent.VK_O ) );
246                  menuSave    =  newMenuItem( menu,  " 保存 " new  MenuShortcut( KeyEvent.VK_S ) );
247                  menuExit    =  newMenuItem( menu,  " 退出 " new  MenuShortcut( KeyEvent.VK_E ) );
248                  menuBar.add( menu );
249                  setMenuBar( menuBar );
250          }
251 
252           private  Choice newChoice( Panel pan, String label ) {
253                  Choice cho  =   new  Choice();
254                  cho.addItemListener(  this  );
255                  pan.add(  new  Label( label ) );
256                  pan.add( cho );
257                   return  cho;
258          }
259 
260           private  Button newButton( Panel pan, String label ) {
261                  Button but  =   new  Button( label );
262                  but.addActionListener(  this  );
263                  pan.add( but );
264                   return  but;
265          }
266 
267           private   void  initTool() {
268                  Panel pan  =   new  Panel();
269                  pan.setLayout(  new  FlowLayout( FlowLayout.CENTER,  10 1  ) );
270 
271                  choLineType  =  newChoice( pan,  " 线条 "  );
272                  choLineType.add(  " 实线 "  );
273                  choLineType.add(  " 虚线 "  );
274                  choLineType.select(  0  );
275 
276                  choLineWidth  =  newChoice( pan,  " 线宽 "  );
277                  choLineWidth.add(  " 1 "  );
278                  choLineWidth.add(  " 4 "  );
279                  choLineWidth.select(  0  );
280 
281                  choColor  =  newChoice( pan,  " 颜色 "  );
282                  choColor.add(  " "  );
283                  choColor.add(  " "  );
284                  choColor.add(  " 自定义 "  );
285                  choColor.select(  0  );
286 
287                  butLine  =  newButton( pan,  " 直线 "  );
288                  butTria  =  newButton( pan,  " 三角形 "  );
289                  butOval  =  newButton( pan,  " "  );
290                  butRect  =  newButton( pan,  " 矩形 "  );
291 
292                  add( pan, BorderLayout.NORTH );
293          }
294 
295           private   void  initCanvas() {
296                   float  [] dashArray  =   new   float []{  1.0f 0.0f  };
297                  canvas  =   new  PainterCanvas( Color.BLACK, PainterCanvas.LINE,  1.0f , dashArray,  0.0f new  Dimension(  600 400  ) );
298                  pl  =   new  Panel(  null  );
299                  pl.add( canvas );
300                  canvas.setBounds(  0 0 , canvas.getSize().width, canvas.getSize().height );
301                  pl.setBounds(  0 0 , canvas.getSize().width, canvas.getSize().height );
302                   if  ( pane  !=   null  ) {
303                          remove( pane );
304                  }
305                  pane  =   new  JScrollPane( pl );
306                  add( pane, BorderLayout.CENTER );
307          }
308 
309           private   void  onMenuNew() {
310                   if  ( onLeaveButCancel() ) {
311                           return ;
312                  }
313                  initCanvas();
314                  validate();
315          }
316 
317           private   void  onMenuOpen() {
318                   if  ( onLeaveButCancel() ) {
319                           return ;
320                  }
321                  JFileChooser fc  =   new  JFileChooser();
322                   int  cho  =  fc.showOpenDialog(  this  );
323                   if  ( cho  ==  JFileChooser.APPROVE_OPTION ) {
324                          file  =  fc.getSelectedFile();
325                          BufferedImage img;
326                           try  {
327                                   img  =  ImageIO.read( file );
328                          }
329                           catch  ( IOException ex ) {
330                                  JOptionPane.showMessageDialog(  this " 图像载入失败! "  );
331                                  file  =   null ;
332                                   return ;
333                          }
334                          pl.setSize( img.getWidth(), img.getHeight() );
335                          canvas.setBufferedImage( img );
336                          file  =   null ;
337                  }
338          }
339 
340           private   boolean  onLeaveButCancel() {
341                   int  cho  =  JOptionPane.showConfirmDialog(  this " 保存当前图片? "  );
342                   switch  ( cho ) {
343                           case  JOptionPane.YES_OPTION :
344                                  onSave();
345                           case  JOptionPane.NO_OPTION : 
346                                  file  =   null ;
347                                   return   false ;
348                  }
349                   return   true ;
350          }
351 
352           private   void  onMenuSave() {
353                  onSave();
354          }
355 
356           private   void  onSave() {
357                   if  ( file  ==   null  ) {
358                          JFileChooser fc  =   new  JFileChooser();
359                           int  cho  =  fc.showSaveDialog(  this  );
360                           if  ( cho  ==  JFileChooser.APPROVE_OPTION ) {
361                                  file  =  fc.getSelectedFile();
362                          }
363                  }
364                   if  ( file  !=   null  ) {
365                           try  {
366                                  ImageIO.write( canvas.getBufferedImage(),  " PNG " , file );
367                          }
368                           catch  ( IOException ex ) {
369                                  JOptionPane.showMessageDialog(  this " 保存失败! "  );
370                          }
371                  }
372          }
373 
374           private   void  onMenuExit() {
375                  onExit();
376          }
377 
378           private   void  onExit() {
379                   if  (  !  onLeaveButCancel() ) {
380                          System.exit(  0  );
381                  }
382          }
383 
384           private   void  onChoiceLineType() {
385                   float  [] da;
386                   switch  ( choLineType.getSelectedIndex() ) {
387                           case   0  :
388                                  da  =   new   float []{  1.0f 0.0f  };
389                                  canvas.setLineDash( da,  0.0f  );
390                                   break ;
391                           case   1  :
392                                  da  =   new   float []{  4.0f 8.0f  };
393                                  canvas.setLineDash( da,  0.0f  );
394                                   break ;
395                  }
396          }
397 
398           private   void  onChoiceLineWidth() {
399                   switch  ( choLineWidth.getSelectedIndex() ) {
400                           case   0  :
401                                  canvas.setLineWidth(  1.0f  );
402                                   break ;
403                           case   1  :
404                                  canvas.setLineWidth(  4.0f  );
405                                   break ;
406                  }
407          }
408 
409           private   void  onChoiceColor() {
410                   switch  ( choColor.getSelectedIndex() ) {
411                           case   0  :
412                                  canvas.setColor( Color.BLACK );
413                                   break ;
414                           case   1  :
415                                  canvas.setColor( Color.RED );
416                                   break ;
417                           case   2  :
418                                  canvas.setColor( JColorChooser.showDialog(  this " 自定义颜色 " , canvas.getColor() ) );
419                                   break ;
420                  }
421          }
422 
423           private  MenuItem       menuNew, menuOpen, menuSave, menuExit;
424           private  Choice         choLineType, choLineWidth, choColor;
425           private  Button         butLine, butTria, butOval, butRect;
426           private  PainterCanvas  canvas;
427           private  Panel          pl;
428           private  JScrollPane    pane  =   null ;
429           private  File           file  =   null ;
430 
431  }
432 
433 
434  // ------------------------------------------------------------------------------------------
435 
436 
437  public   class  Painter {
438 
439           public   static   void  main( String [] args ) {
440                   new  PainterWin();
441          }
442 
443  }
444 
445 

 

你可能感兴趣的:(画板 Java实现)