博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
画图程序 java_一个JAVA画图程序
阅读量:5900 次
发布时间:2019-06-19

本文共 3641 字,大约阅读时间需要 12 分钟。

近期根据视频教程搞了一个JAVA画图程序,做了一个太阳系模型的源码。涉及到一些AWT和面向对象的东西。详细来看一下吧。

先来看一下效果吧:

0818b9ca8b590ca3270a3433284dd417.png

基本的画图理论就省略了。要实现该程序关键有二个通用的程序:

一、继承Frame的一个窗口初始化程序

public class  MyFrame extends Frame {

public void LaunchFrame() {

setSize(Constants.FRAME_WIDTH,Constants.FRAME_HIGH);

setLocation(100,100);

setVisible(true);

setBackground(Color.BLACK);

addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent arg0) {

System.exit(0);

}

});

new RepaintThread().start();

}

class RepaintThread extends Thread {                //启动一个线程反复画图,是实现主程序中的Paint()方法,实现动画效果,很关键!!!!!

public void start() {

while (true) {

repaint();

try {

sleep(40);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

二、 获取图片资源(在后面的程序中反复用到)

public static Image getImage(String path) {

URL u=GameUtil.class.getClassLoader().getResource(path);

BufferedImage img=null;

try {

img=ImageIO.read(u);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return img;

}

}

主程序中使用继承和重载构建了两个类START和PLANET:

一首先Start类,主要功能是画星体。

public class Stars {

Image img;

double x,y;

int width,high;

public void draw(Graphics g) {

g.drawImage(img,(int)x,(int)y,null);

}

public Stars()

{

}

public Stars(String path,double x,double y) {

this.img=GameUtil.getImage(path);

this.width=img.getWidth(null);

this.high=img.getHeight(null);

this.x=x-width/2;

this.y=y-high/2;

}

public Stars(Image img){

this.img=img;

this.width=img.getWidth(null);

this.high=img.getHeight(null);

}

}

二、Planet类继承与Start类,主要实现星体的运行轨迹计算和围绕实现。

public class Planet extends Stars{

/**

* 星体的属性

*  */

double longAxis;//长轴

double shortAxis;//短轴

double speed;//速度

double degree;//角度

Stars center;//用于计算星体的中心位置。

boolean issatelite;

public void draw(Graphics g) {

/*

* 画椭圆轨迹

* */

g.drawImage(img, (int)x,(int)y,null);

if(!issatelite){

drawTrace(g);

}

move();

}

public void move(){

x=(center.x+center.width/2-img.getWidth(null)/2)+longAxis*Math.cos(degree);

y=(center.y+center.high/2-img.getHeight(null)/2)+shortAxis*Math.sin(degree);

degree+=speed;

}

public void  drawTrace(Graphics g) {

double ovalx,ovaly,ovalwidth,ovalheight;

ovalx=(center.x+center.width/2)-longAxis;

ovaly=(center.y+center.high/2)-shortAxis;

ovalwidth=longAxis*2;

ovalheight=shortAxis*2;

//避免画笔改动

Color c=g.getColor();

g.setColor(Color.RED);

g.drawOval((int)ovalx,(int)ovaly,(int)ovalwidth,(int)ovalheight);

g.setColor(c);

}

public Planet( Stars center,String path, double longAxis,

double shortAxis, double speed) {

super(GameUtil.getImage(path));

this.center = center;

this.x=center.x+longAxis;

this.y=center.y;

//this.img=GameUtil.getImage(path);

this.longAxis = longAxis;

this.shortAxis = shortAxis;

this.speed = speed;

}

public Planet( Stars center,String path, double longAxis,

double shortAxis, double speed,boolean issatelite) {

this(center,path,longAxis,shortAxis,speed);

this.issatelite=issatelite;

}

public Planet(String path, double x, double y) {

super(path, x, y);

}

}

另外在主程序中调用就可以了:

public class MySolarFrame  extends MyFrame{

//Image img=GameUtil.getImage("images/sun.png");

Stars sun=new Stars("images/sun.png", Constants.FRAME_WIDTH/2, Constants.FRAME_HIGH/2);

Planet earth=new Planet(sun,"images/earth.png", 220, 180,0.01);

Planet mars=new Planet(sun,"images/3.png", 300, 250,0.02);

Planet venus=new Planet(sun,"images/Venus.png", 100, 80,0.03);

Planet moon=new Planet(earth,"images/moon.png", 60, 40,0.03,true);

public void paint(Graphics g) {

//g.drawImage(img,Constants.FRAME_WIDTH/2-64,Constants.FRAME_HIGH/2-64,null);

sun.draw(g);

earth.draw(g);

mars.draw(g);

venus.draw(g);

moon.draw(g);

}

public static void main(String[] args) {

new MySolarFrame().LaunchFrame();

}

}

程序结束,欢迎大家批评指正,附整个程序的源代码:http://page92.ctfile.com/file/140761906

转载地址:http://sgqsx.baihongyu.com/

你可能感兴趣的文章
C#基础知识整理 基础知识(21) 委托(二)
查看>>
Android应用程序键盘(Keyboard)消息处理机制分析(16)
查看>>
Sysbench 0.5版安装配置
查看>>
统一沟通-技巧-11-Lync-联盟-无法-音频-远程桌面-传文件
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
2014.7.30-8.3日广大网友的提问解答(答问题的第2个工作周)
查看>>
Powershell管理系列(二十五)PowerShell操作之获取AD账号及邮箱信息
查看>>
Linux安装telnet
查看>>
【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物...
查看>>
openstack nova修改实例路径,虚拟磁盘路径
查看>>
java.sql.SQLException: Lock wait timeout exceeded --转
查看>>
使用C#进行图像处理的几种方法(转)
查看>>
Ajax原理学习
查看>>
sap scriptfom 多语言翻译
查看>>
实现超级简单的bug管理系统
查看>>
[LeetCode] Find Anagram Mappings 寻找异构映射
查看>>
--Too small initial heap for new size specified
查看>>
黄聪:3分钟学会sessionStorage用法
查看>>
Entity Framework 全面教程详解(转)
查看>>