java优米乐园_画板 Java实现

1 //ubuntu  windows endl2 3 importjava.awt.*;4 importjava.awt.event.*;5 importjava.awt.image.*;6 importjava.io.*;7 importjavax.swing.*;8 importjavax.imageio.*;9 10 classPainterCanvasextendsCanvas {11 12 publicPainterCanvas( Color foregroundColor,intinitPaintType,floatlineWidth,float[] dashArray,floatdashPhase, Dimension size ) {13 setColor( foregroundColor );14 setBackground( COLOR_BACK );15 paintType=LINE;16 setPaintType( initPaintType );17 paintStroke=newBasicStroke();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(new26 MouseAdapter() {27 publicvoidmousePressed( MouseEvent me ) {28 if(!pressed ) {29 startX=me.getX();30 startY=me.getY();31 pressed=true;32 }33 }34 publicvoidmouseReleased( 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(newMouseMotionAdapter() {46 publicvoidmouseDragged( MouseEvent me ) {47 endX=me.getX();48 endY=me.getY();49 repaint();50 }51 } );52 }53 54 publicvoidsetPaintType(intt ) {55 if( ( t==LINE )||( t==TRIA )||( t==OVAL )||( t==RECT ) ) {56 paintType=t;57 }58 }59 60 publicvoidsetColor( Color col ) {61 colorFore=col;62 }63 64 publicvoidsetLineWidth(floatlineWidth ) {65 if( lineWidth>0.0f) {66 paintStroke=newBasicStroke( lineWidth, paintStroke.getEndCap(),67 paintStroke.getLineJoin(), paintStroke.getMiterLimit(),68 paintStroke.getDashArray(), paintStroke.getDashPhase() );69 }70 }71 72 publicvoidsetLineDash(float[] dashArray,floatdashPhase ) {73 paintStroke=newBasicStroke( paintStroke.getLineWidth(), paintStroke.getEndCap(),74 paintStroke.getLineJoin(), paintStroke.getMiterLimit(),75 dashArray, dashPhase );76 }77 78 publicvoidsetBufferedDimension( Dimension size ) {79 setSize( size );80 dimSize=size;81 img=newBufferedImage( 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 publicvoidsetBufferedImage( 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 publicColor getColor() {96 returncolorFore;97 }98 99 publicBufferedImage getBufferedImage() {100 returnimg;101 }102 103 publicvoidpaint( Graphics g ) {104 g.drawImage( img,0,0, dimSize.width, dimSize.height,this);105 paintUpdate( g );106 }107 108 publicvoidupdate( Graphics g ) {109 g.drawImage( img,0,0, dimSize.width, dimSize.height,this);110 paintUpdate( g );111 }112 113 publicvoidpaintUpdate( Graphics gra ) {114 Graphics2D g=(Graphics2D)gra;115 g.setColor( colorFore );116 g.setStroke( paintStroke );117 graImg.setColor( colorFore );118 graImg.setStroke( paintStroke );119 intx=Math.min( startX, endX );120 inty=Math.min( startY, endY );121 intw=startX+endX-x-x;122 inth=startY+endY-y-y;123 switch( paintType ) {124 caseLINE :125 g.drawLine( startX, startY, endX, endY );126 if( drawBuffer ) {127 graImg.drawLine( startX, startY, endX, endY );128 }129 break;130 caseTRIA :131 g.drawPolygon(newint[]{ startX, x, endX },newint[]{ startY, ( startY+endY )/2, endY },3);132 if( drawBuffer ) {133 graImg.drawPolygon(newint[]{ startX, x, endX },newint[]{ startY, ( startY+endY )/2, endY },3);134 }135 break;136 caseOVAL :137 g.drawOval( x, y, w, h );138 if( drawBuffer ) {139 graImg.drawOval( x, y, w, h );140 }141 break;142 caseRECT :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 privateintstartX, startY, endX, endY, paintType;153 privateColor           colorFore;154 privatebooleanpressed, drawBuffer;155 privateBasicStroke     paintStroke;156 privateGraphics2D      graImg;157 privateBufferedImage   img;158 privateDimension       dimSize;159 160 privatestaticfinalColor COLOR_BACK=Color.WHITE;161 publicstaticfinalintLINE=0, TRIA=1, OVAL=2, RECT=3;162 163 }164 165 166 //------------------------------------------------------------------------------------------167 168 169 classPainterWinextendsFrameimplementsActionListener, ItemListener {170 171 publicPainterWin() {172 super("画板 --- 赵杰");173 initFrame();174 initMenu();175 initTool();176 initCanvas();177 setVisible(true);178 validate();179 }180 181 publicvoidactionPerformed( ActionEvent ae ) {182 Object obj=ae.getSource();183 if( obj==menuNew ) {184 onMenuNew();185 }186 elseif( obj==menuOpen ) {187 onMenuOpen();188 }189 elseif( obj==menuSave ) {190 onMenuSave();191 }192 elseif( obj==menuExit ) {193 onMenuExit();194 }195 elseif( obj==butLine ) {196 197 canvas.setPaintType( PainterCanvas.LINE );198 }199 elseif( obj==butTria ) {200 canvas.setPaintType( PainterCanvas.TRIA );201 }202 elseif( obj==butOval ) {203 canvas.setPaintType( PainterCanvas.OVAL );204 }205 elseif( obj==butRect ) {206 canvas.setPaintType( PainterCanvas.RECT );207 }208 }209 210 publicvoiditemStateChanged( ItemEvent ie ) {211 Object obj=ie.getSource();212 if( obj==choLineType ) {213 onChoiceLineType();214 }215 elseif( obj==choLineWidth ) {216 onChoiceLineWidth();217 }218 elseif( obj==choColor ) {219 onChoiceColor();220 }221 }222 223 privatevoidinitFrame() {224 setBounds(300,200,600,500);225 addWindowListener(newWindowAdapter() {226 publicvoidwindowClosing( WindowEvent we ) {227 onExit();228 }229 }230 );231 setLayout(newBorderLayout() );//default232 }233 234 privateMenuItem newMenuItem( Menu menu, String label, MenuShortcut sc ) {235 MenuItem item=newMenuItem( label, sc );236 item.addActionListener(this);237 menu.add( item );238 returnitem;239 }240 241 privatevoidinitMenu() {242 MenuBar menuBar=newMenuBar();243 Menu    menu=newMenu("文件");244 menuNew=newMenuItem( menu,"新建",newMenuShortcut( KeyEvent.VK_N ) );245 menuOpen=newMenuItem( menu,"打开",newMenuShortcut( KeyEvent.VK_O ) );246 menuSave=newMenuItem( menu,"保存",newMenuShortcut( KeyEvent.VK_S ) );247 menuExit=newMenuItem( menu,"退出",newMenuShortcut( KeyEvent.VK_E ) );248 menuBar.add( menu );249 setMenuBar( menuBar );250 }251 252 privateChoice newChoice( Panel pan, String label ) {253 Choice cho=newChoice();254 cho.addItemListener(this);255 pan.add(newLabel( label ) );256 pan.add( cho );257 returncho;258 }259 260 privateButton newButton( Panel pan, String label ) {261 Button but=newButton( label );262 but.addActionListener(this);263 pan.add( but );264 returnbut;265 }266 267 privatevoidinitTool() {268 Panel pan=newPanel();269 pan.setLayout(newFlowLayout( 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 privatevoidinitCanvas() {296 float[] dashArray=newfloat[]{1.0f,0.0f};297 canvas=newPainterCanvas( Color.BLACK, PainterCanvas.LINE,1.0f, dashArray,0.0f,newDimension(600,400) );298 pl=newPanel(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=newJScrollPane( pl );306 add( pane, BorderLayout.CENTER );307 }308 309 privatevoidonMenuNew() {310 if( onLeaveButCancel() ) {311 return;312 }313 initCanvas();314 validate();315 }316 317 privatevoidonMenuOpen() {318 if( onLeaveButCancel() ) {319 return;320 }321 JFileChooser fc=newJFileChooser();322 intcho=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 privatebooleanonLeaveButCancel() {341 intcho=JOptionPane.showConfirmDialog(this,"保存当前图片?");342 switch( cho ) {343 caseJOptionPane.YES_OPTION :344 onSave();345 caseJOptionPane.NO_OPTION :346 file=null;347 returnfalse;348 }349 returntrue;350 }351 352 privatevoidonMenuSave() {353 onSave();354 }355 356 privatevoidonSave() {357 if( file==null) {358 JFileChooser fc=newJFileChooser();359 intcho=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 privatevoidonMenuExit() {375 onExit();376 }377 378 privatevoidonExit() {379 if(!onLeaveButCancel() ) {380 System.exit(0);381 }382 }383 384 privatevoidonChoiceLineType() {385 float[] da;386 switch( choLineType.getSelectedIndex() ) {387 case0:388 da=newfloat[]{1.0f,0.0f};389 canvas.setLineDash( da,0.0f);390 break;391 case1:392 da=newfloat[]{4.0f,8.0f};393 canvas.setLineDash( da,0.0f);394 break;395 }396 }397 398 privatevoidonChoiceLineWidth() {399 switch( choLineWidth.getSelectedIndex() ) {400 case0:401 canvas.setLineWidth(1.0f);402 break;403 case1:404 canvas.setLineWidth(4.0f);405 break;406 }407 }408 409 privatevoidonChoiceColor() {410 switch( choColor.getSelectedIndex() ) {411 case0:412 canvas.setColor( Color.BLACK );413 break;414 case1:415 canvas.setColor( Color.RED );416 break;417 case2:418 canvas.setColor( JColorChooser.showDialog(this,"自定义颜色", canvas.getColor() ) );419 break;420 }421 }422 423 privateMenuItem       menuNew, menuOpen, menuSave, menuExit;424 privateChoice         choLineType, choLineWidth, choColor;425 privateButton         butLine, butTria, butOval, butRect;426 privatePainterCanvas  canvas;427 privatePanel          pl;428 privateJScrollPane    pane=null;429 privateFile           file=null;430 431 }432 433 434 //------------------------------------------------------------------------------------------435 436 437 publicclassPainter {438 439 publicstaticvoidmain( String [] args ) {440 newPainterWin();441 }442 443 }444 445

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体; (3)设置边框布局,因为整个画板大致为左边部分,中间部分,菜单栏三个部分,用边框布局比较合适; (4)给窗体添加左面板,中间面板; (5)给左面板添加按钮,并设置按钮图片和效果; (6)给左面板添加左子面板,用来存放颜色按钮; 2.画板功能设计 (1)给左画板中的按钮组中的每个按钮添加鼠标监听器; (2)点击不同按钮,绘制不同的图形; (3)给左子面板中的每个颜色按钮添加鼠标监听器; (4)根据下面板中选中的颜色按钮,来获取按钮的背景颜色,并将该颜色设置成画笔的颜色; (5)铅笔功能 1、铅笔是鼠标拖动时画的线,所需要实现鼠标移动监听器,我们采用一个类来实现多个接口; 2、添加新的鼠标监听器类; 3、在鼠标移动时间中实现画笔的逻辑(其实就是绘制直线,鼠标每移动一个像素,就会触发移动事件,通过移动事件获取鼠标的坐标,与上一次移动的坐标连线就可以了; (6)刷子功能 刷子其实就是加粗的画笔,画出来的直线更粗,这里需要用到Graphic2D画笔来设置画笔的粗细。 (7)橡皮擦功能 橡皮擦就是把画笔颜色设置成相同的背景颜色就可以了,拖动鼠标时进行擦除,所以在鼠标拖动事件中编写。 (8)喷桶功能 1、定位方法:鼠标拖动事件实现; 2、随机数生成:Random; 3、实现原理,在鼠标拖动附近绘制很多的原点; 3. 画板的保存和重绘的设计 (1)给我们的画板添加菜单条、菜单以及菜单项 (2)给每个菜单项添加监听器 (3)点击不同的菜单项实现相应的功能 (4)图形保存功能:利用对象输出流,将容器对象写入文件; (5)打开图形功能:利用对象输入流,将容器对象读入,然后将容器里面的图形对象在画板上绘制出来 (6)新建文件功能:新建文件,将画板上绘制的内容清空(清空之前可以确认是否需要进行保存)清屏(重绘)功能依次方法; (7)文件保存格式为BMP格式; (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值