开发工具与关键技术: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();
}
}