JAVA图形编程Swing之——JPanel绘图
    一直搞不清怎么在JPanel中绘2D图像,主要是不知怎样得到Graphics类的对像来画图,今天查了查资料,测试N种方法,终于搞明白。下面做一个测试总结。
     一、自定义一个类,继承JPanel,直接重写它的paint方法。
/*** 定义一个继承自JPanel的类,重写它的paint方法 **/
class MyPanel extends JPanel
{private int x = 200;private int y = 200;public void display(){x ++;y ++;//重绘JPanelthis.repaint();}/*** repaint方法会调用paint方法,并自动获得Graphics对像* 然后可以用该对像进行2D画图* 注:该方法是重写了JPanel的paint方法*/public void paint(Graphics g){//调用的super.paint(g),让父类做一些事前的工作,如刷新屏幕super.paint(g); Graphics2D g2d = (Graphics2D)g;g2d.setColor(Color.RED);//设置画图的颜色g2d.fill3DRect(x, y, 100, 100, true);//填充一个矩形      }
}public class PanelTest
{public static void main(String[] args){JFrame  jf = new JFrame();MyPanel jp = new MyPanel();jf.setBounds(200, 200, 500, 500);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.add(jp);jf.setVisible(true);while(true){//不停的重绘JPanel,实现动画的效果jp.display();try{Thread.sleep(300);}catch (InterruptedException e){e.printStackTrace();}}}
}

然而,上面的方法不总是有效的,在开始的时候,如果为得到Graphics对像,那么g就为null,而下面直接使用g,就会产生空指针异常 。稳妥的办法是在使用g之前要加上判断 if(g != null) { ........}

    二、图像缓冲
    第二种方法就是使用Image和BufferImage技术,预先在一个图形缓冲中绘好要显示的内容,然后在paint方法中,一次性的把图形缓冲刷新到JPanel里肌,这种方法涉及到AWT中的Image和BufferImage,前者是一个接口,后者是一个可以实例化的类。其实,JPanel也是继承自AWT的Component类,该类有一个方法:Image createImage(int width, int height) ,这个方法也常在继承自JPanel的类中用于创建一幅用于双缓冲的、可在屏幕外绘制的图像。
    实现方法一:
/*** 定义一个继承自JPanel的类,重写它的paint方法 **/
class MyPanel1 extends JPanel
{private int x = 200;private int y = 200;private Image image; //图像缓冲private Graphics og;public void display(){x ++;y ++;if(og == null){//JPanel继承自Component类,可以使用它的方法createImage创建一幅和JPanel大小相同的图形缓冲//然后用它Image接口的方法获得绘图对像image = this.createImage(this.getWidth(),this.getHeight());if(image != null)og = image.getGraphics();}if(og != null){//调用的super.paint(g),让父类做一些事前的工作,如刷新屏幕super.paint(og);  og.setColor(Color.RED);             //设置画图的颜色og.fill3DRect(x, y, 100, 100, true);//绘图               //this.paint(this.getGraphics());}//重绘JPanelthis.repaint();}/*** repaint方法会调用paint方法,并自动获得Graphics对像* 然后可以用该对像进行2D画图* 注:该方法是重写了JPanel的paint方法*/public void paint(Graphics g){g.drawImage(image, 0, 0, this);  }
}public class PanelTest2
{public static void main(String[] args){JFrame  jf = new JFrame();MyPanel1 jp = new MyPanel1();jf.setBounds(200, 200, 500, 500);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.add(jp);jf.setVisible(true);while(true){//不停的重绘JPanel,实现动画的效果jp.display();try{Thread.sleep(300);}catch (InterruptedException e){e.printStackTrace();}}}
}

上面的方法是在自定义Panel的内部实现了Image对像的创建,绘图,刷新,然后有时候程序的模块化划分方法并不是这样,所以还可以在该类的外部创建一个Image对像,并完成绘图,将该对像的引用传递给自定义Panel的绘图方法,也可以完成绘图,并且,我觉得这样更灵活。

    
    实现方法二:
class MyPanel3 extends JPanel
{private int x = 200;private int y = 200;private Graphics g;private Image im ;//构造方法,获得外部Image对像的引用public MyPanel3(Image im){if(im != null){this.im = im;g = im.getGraphics();}}public void display(){x ++;y ++;            if(g != null){//调用的super.paint(g),让父类做一些事前的工作,如刷新屏幕super.paint(g);g.setColor(Color.RED);                //设置画图的颜色g.fill3DRect(x, y, 100, 100, true);    //填充一个矩形        //更新缓图this.repaint();}}/*** repaint方法会调用paint方法,并自动获得Graphics对像* 然后可以用该对像进行2D画图* 注:该方法是重写了JPanel的paint方法*/public void paint(Graphics g){g.drawImage(im, 0, 0, this);}
}public class PanelTEST4
{public static void main(String[] args){//在自定义Panel的外部定义一个Image绘图区Image im = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB);JFrame   jf = new JFrame();//通过构造方法将缓冲缓冲区对像的引用传给自定义PanelMyPanel3 jp = new MyPanel3(im);jf.setBounds(200,200,500, 500);jp.setSize(300, 300);jf.add(jp);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);          jf.setVisible(true);while(true){jp.display();try{Thread.sleep(300);} catch (InterruptedException e){e.printStackTrace();}}      }
}

总结:在绘制2D图形和实现动画的效果时,要用到AWT中的绘图技术和缓冲技术,如果只是简单的绘图,那么自定义Panel类,重写Paint方法,把要绘图代码放到paint方法中,由系统自动调用paint方法即可。

    要实现动画效果则就要定时的调用repaint方法,repaint方法则会调用paint方法实现Panel重绘。
    JPanel在什么情况下会被重绘呢?
    1. 在repaint方法被显式的调用时。
    2. 在窗口最小化然后又被显示时。
    3. 在窗口被拉伸时。

JAVA图形编程Swing之——JPanel绘图相关推荐

  1. Java图形编程实验总结_实验二java图形界面编程2015级.doc

    实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...

  2. Java图形编程实验总结_JAVA实验报告简单绘图程序

    <JAVA实验报告简单绘图程序>由会员分享,可在线阅读,更多相关<JAVA实验报告简单绘图程序(8页珍藏版)>请在人人文库网上搜索. 1.实验三绘制图形一.实验目的学会JBut ...

  3. java 刷新jpanel_Java Swing刷新JPanel

    我有一个Applet类(扩展 JApplet ) . 在类中,我实例化一个JPanel并初始化一个JButton whit setEnabled(true) . 用户在Panel中单击此按钮并进行一些 ...

  4. java jfm入门_java图形编程

    //将布局管理器设置为边框布局 this.setLayout(new BorderLayout()); 边框布局:将组件按东南西北中的方式进行放置.一个方向只能放一个组件,组件大小岁容 jfm.set ...

  5. java 图形界面设计,使用JPanel、JFrame 绘图,图形界面设计入门演示,各种主要绘图方法以及图片、文字插入

    那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧: JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel ...

  6. Java图形界面编程模拟ATM自助取款系统

    本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现. 程序初始时 考号:123456 密码:123 ...

  7. java图形界面多线程_多线程编程、Java I/O系统和Java图形界面编程

    多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同 ...

  8. Java图形界面编程

    一.Java图形用户界面(gui)介绍 1.Java GUI简介   图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加 ...

  9. c 语言绘图函数,c语言图形编程(三、绘图函数-)(C language graphics programming (three, drawing function -)).doc...

    c语言图形编程(三.绘图函数-)(C language graphics programming (three, drawing function -)).doc c语言图形编程(三.绘图函数-01) ...

最新文章

  1. ssh_exchange_identification: Connection closed by remote host 问题的解决 (转)
  2. Apache多网站虚拟目录域名
  3. spring整合问题集合1
  4. linux shell跳板机,用shell开发跳板机
  5. Windows下Git的下载与安装
  6. 与计算化学相关的计算机程序,计算机引发化学工程革命
  7. Problem C: 爬楼梯
  8. idea 断点调试 以及 tomcat 无法访问
  9. php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
  10. java项目怎么启动_github上的java项目怎么运行(面向小白)
  11. SVN下载安装及使用教程
  12. MATLAB常用画图命令汇总【已坑】
  13. Windows驱动加载工具---DriverLoader
  14. python源码深度剖析_Python 源码深度剖析
  15. 富勒wms系统里的定时器id_「案例」全面升级的康缘药业物流系统
  16. 新版macbook,PPT导出PDF复制文字乱码问题的解决
  17. C#实现简单的加密防止拷贝复制软件
  18. 数据库周刊60丨3月国产数据库排行榜出炉;日本银行数据迁移失败致使业务宕机;阿里云RDS PG13发布;亚健康Oracle数据库故障定位;Redis最佳实践;MySQL查询优化……
  19. Unity实现音乐播放器
  20. 团队管理--领导力的重要性

热门文章

  1. 如东人院附近一网吧转让
  2. 1.markdown基础语法
  3. 用树莓派做电视盒子,安装Android TV系统
  4. ReentrantLock和synchronized锁
  5. x64 汇编跟 rax , eax ,ax ,ah ,al 的关系
  6. SVAC-Intra-Prei 代码分析(帧内预测最佳预测角度的选择)
  7. PS如何查看所选图层的实际像素?
  8. excel手机版_手机版excel怎么用
  9. 装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
  10. csust2019集训队选拔赛题解