使用Java制作太阳系模型(2)

开发工具与关键技术:MyEclipse 10、JAVA
作者:曾浩源
撰写时间:2019年04月22日

做任何程序都离不开良好的封装,虽然这次只需要一个主页窗体,假如有许多个窗体,在每个窗体初始化都是经过同样的步骤。
所以窗体也是可以进行封装的,例如:每个窗体都有设置xy位置,宽高,需要在窗体监听事件重写关闭按钮方法,重画窗体的线程,以及解决窗体内容进行运动时闪烁的双缓冲。
该类继承Frame后,将窗体的共同的放入;

public void frame(){//窗体的初始化设置 
//为了良好的封装,可以把常量封装到一个常量类Constant里面
		setSize(Constant.MAIN_WIDTH, Constant.MAIN_HEIGHT);
		setLocation(Constant.LOCATION_X, Constant.LOCATION_Y);
		setVisible(true);
		new PaintThread().start();
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	Image ImageBuffer = null;  
	Graphics GraImage = null;  
//创建缓冲,防止内容闪烁
	public void update(Graphics g){     //覆盖update方法,截取默认的调用过程  
  		//创建图形缓冲区  
	    ImageBuffer = createImage(this.getWidth(), this.getHeight()); 	    		GraImage = ImageBuffer.getGraphics();    //获取图形缓冲区的图形上下文  
	    paint(GraImage);        //用paint方法中编写的绘图过程对图形缓冲区绘图  
	    GraImage.dispose();     //释放图形上下文资源  
	    g.drawImage(ImageBuffer, 0, 0, this);   //将图形缓冲区绘制到屏幕上  
	}  
	class PaintThread extends Thread{//重画内容,线程
		@Override
		public void run() {
			while (true) {
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

对于常量的封装最简单,直接放进去就好

public class Constant {
	public static final int MAIN_WIDTH=900;
	public static final int MAIN_HEIGHT=900;
	
	public static final int LOCATION_X=400;
	public static final int LOCATION_Y=100;
}

封装好窗体后,这里叫它(SolarFrame)窗体框架类,要在显示窗体的(叫它窗体主页类MainFrame)类继承 窗体框架,后在main方法里实例化,调用方法显示窗口。

	public static void main(String[] args) {
		MainFrame frame = new MainFrame();
		frame.frame();
}		

封装后,窗体主页类里,只有main方法、成员变量和paint方法了,不仅界面简洁清晰,以后使用起来也非常方便。

public class GameFrame extends SolarFrame {
	private static final long serialVersionUID = 1L;
	
	private double x2 = 100, y2 = 100;
	private double degree1;
	@Override
	public void paint(Graphics g) {
		Image image2 = GameUtil.getImage("Image/sun.jpg");
		g.drawImage(image2, (int) x2, (int) y2, null);
		x2 = 200 + 100 * Math.cos(degree1);
		y2 = 200 + 50 * Math.sin(degree1);
		degree1 += 0.1;
		repaint();//重画
	}

	public static void main(String[] args) {
		GameFrame frame = new GameFrame();
		frame.frame();
	}

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值