知识点:
- JFrame窗体类关键属性、方法和事件的应用
- Canvas画板类的关键方法和事件的应用
- 窗体菜单栏的创建和层级关系
- 工具栏、按钮的配合使用
- 鼠标点击、移动事件的使用
- 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 }
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 }
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 }
3.项目界面