JAVA图形编程Swing之——JPanel绘图
/*** 定义一个继承自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) { ........}
/*** 定义一个继承自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方法即可。
JAVA图形编程Swing之——JPanel绘图相关推荐
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...
- Java图形编程实验总结_JAVA实验报告简单绘图程序
<JAVA实验报告简单绘图程序>由会员分享,可在线阅读,更多相关<JAVA实验报告简单绘图程序(8页珍藏版)>请在人人文库网上搜索. 1.实验三绘制图形一.实验目的学会JBut ...
- java 刷新jpanel_Java Swing刷新JPanel
我有一个Applet类(扩展 JApplet ) . 在类中,我实例化一个JPanel并初始化一个JButton whit setEnabled(true) . 用户在Panel中单击此按钮并进行一些 ...
- java jfm入门_java图形编程
//将布局管理器设置为边框布局 this.setLayout(new BorderLayout()); 边框布局:将组件按东南西北中的方式进行放置.一个方向只能放一个组件,组件大小岁容 jfm.set ...
- java 图形界面设计,使用JPanel、JFrame 绘图,图形界面设计入门演示,各种主要绘图方法以及图片、文字插入
那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧: JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel ...
- Java图形界面编程模拟ATM自助取款系统
本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现. 程序初始时 考号:123456 密码:123 ...
- java图形界面多线程_多线程编程、Java I/O系统和Java图形界面编程
多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同 ...
- Java图形界面编程
一.Java图形用户界面(gui)介绍 1.Java GUI简介 图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加 ...
- c 语言绘图函数,c语言图形编程(三、绘图函数-)(C language graphics programming (three, drawing function -)).doc...
c语言图形编程(三.绘图函数-)(C language graphics programming (three, drawing function -)).doc c语言图形编程(三.绘图函数-01) ...
最新文章
- ssh_exchange_identification: Connection closed by remote host 问题的解决 (转)
- Apache多网站虚拟目录域名
- spring整合问题集合1
- linux shell跳板机,用shell开发跳板机
- Windows下Git的下载与安装
- 与计算化学相关的计算机程序,计算机引发化学工程革命
- Problem C: 爬楼梯
- idea 断点调试 以及 tomcat 无法访问
- php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
- java项目怎么启动_github上的java项目怎么运行(面向小白)
- SVN下载安装及使用教程
- MATLAB常用画图命令汇总【已坑】
- Windows驱动加载工具---DriverLoader
- python源码深度剖析_Python 源码深度剖析
- 富勒wms系统里的定时器id_「案例」全面升级的康缘药业物流系统
- 新版macbook,PPT导出PDF复制文字乱码问题的解决
- C#实现简单的加密防止拷贝复制软件
- 数据库周刊60丨3月国产数据库排行榜出炉;日本银行数据迁移失败致使业务宕机;阿里云RDS PG13发布;亚健康Oracle数据库故障定位;Redis最佳实践;MySQL查询优化……
- Unity实现音乐播放器
- 团队管理--领导力的重要性
热门文章
- 如东人院附近一网吧转让
- 1.markdown基础语法
- 用树莓派做电视盒子,安装Android TV系统
- ReentrantLock和synchronized锁
- x64 汇编跟 rax , eax ,ax ,ah ,al 的关系
- SVAC-Intra-Prei 代码分析(帧内预测最佳预测角度的选择)
- PS如何查看所选图层的实际像素?
- excel手机版_手机版excel怎么用
- 装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
- csust2019集训队选拔赛题解