分别建立Lay的子类LayDataBase、LayDisk、LayGame、LayButton、LayNext、LayLevel、LayPoint、LayAbout继承Lay,在创建Lay对象时使用Lay的子类创建,将Lay写成一个抽象类,在Lay类创建一个抽象方法paint,所有子类都必须覆写paint方法,在PanelGame类中将PaintComponent方法中调用的createWindow方法改为paint方法。
package ui;
import java.awt.Graphics;
import javax.swing.JPanel;
public class PanelGame extends JPanel{
private Lay[] lays=null;
public PanelGame(){
lays=new Lay[]{
//TODO 硬编码,是非常不好的开发习惯
//TODO 我们要尽量将数字或字符串定义成常量,或者写入配置文件
new LayBackground(0,0,0,0),
new LayDataBase(40,32,334,279),
new LayDisk(40,343,334,279),
new LayGame(414,32,334,590),
new LayButton(788,32,334,124),
new LayNext(788,188,176,148),
new LayLevel(964,188,158,148),
new LayPoint(788,368,334,200)
};
}
@Override
//表示下面的方法要覆盖父类的方法
public void paintComponent(Graphics g){
//循环刷新游戏画面
for(int i=0;i<lays.length;i++){
//刷新层窗口
lays[i].paint(g);
}
}
}
并将Lay类的变量x,y,w,h都定义为protectd类型,用于子类的调用
package ui; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; /** * 绘制窗口 * @author Administrator * */ public abstract class Lay { //设置string里面图片在对应窗口内边距为16 protected static final int PADDING=16; private static final int SIZE=7; //新建一个图片对象,并指定以工程为根,图片在项目的相对路径 private static final Image WINDOW_IMG=new ImageIcon("Graphics/window/Window.png").getImage(); //取图片宽度 private static int WINDOW_W=WINDOW_IMG.getWidth(null); //取图片高度 private static int WINDOW_H=WINDOW_IMG.getWidth(null); //窗口左上角x坐标 protected int x; //窗口左上角y坐标 protected int y; //窗口宽度 protected int w; //窗口高度 protected int h; protected Lay(int x,int y,int w,int h){ this.x=x; this.y=y; this.w=w; this.h=h; } /** * 绘制窗口 */ protected void creatWindow(Graphics g){ //(图片,图片在Panel上显示范围左上角x,左上角y,右下角x,右下角y,源图片坐标切割起始点x,切割起始点y,切割终点x,切割终点y,null) //左上 g.drawImage(WINDOW_IMG, x, y, x+SIZE, y+SIZE, 0, 0, SIZE, SIZE, null); //中上 g.drawImage(WINDOW_IMG, x+SIZE, y, x+w-SIZE, y+SIZE, SIZE, 0, WINDOW_W-SIZE, SIZE, null); //右上 g.drawImage(WINDOW_IMG, x+w-SIZE, y, x+w, y+SIZE, WINDOW_W-SIZE, 0, WINDOW_W, SIZE, null); //左中 g.drawImage(WINDOW_IMG, x, y+SIZE, x+SIZE, y+h-SIZE, 0, SIZE, SIZE, WINDOW_H-SIZE, null); //中 g.drawImage(WINDOW_IMG, x+SIZE, y+SIZE, x+w-SIZE, y+h-SIZE, SIZE, SIZE, WINDOW_W-SIZE, WINDOW_H-SIZE, null); //右中 g.drawImage(WINDOW_IMG, x+w-SIZE, y+SIZE, x+w, y+h-SIZE, WINDOW_W-SIZE, SIZE, WINDOW_W, WINDOW_H-SIZE, null); //左下 g.drawImage(WINDOW_IMG, x, y+h-SIZE, x+SIZE, y+h, 0, WINDOW_H-SIZE, SIZE, WINDOW_H, null); //中下 g.drawImage(WINDOW_IMG, x+SIZE, y+h-SIZE, x+w-SIZE, y+h, SIZE, WINDOW_H-SIZE, WINDOW_W-SIZE, WINDOW_H, null); //右下 g.drawImage(WINDOW_IMG, x+w-SIZE, y+h-SIZE, x+w, y+h, WINDOW_W-SIZE, WINDOW_H-SIZE, WINDOW_W, WINDOW_H, null); } /** * 刷新游戏具体内容 * @author xiayichong * @param g 画笔 */ //定义一个抽象方法,必须被子类覆写 public abstract void paint(Graphics g); } 向LayDataBase类中插入一张“数据库”图片
package ui; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; public class LayDataBase extends Lay{ private static Image IMG_DB=new ImageIcon("Graphics/string/db.png").getImage(); public LayDataBase(int x,int y,int w,int h){ super(x,y,w,h); } public void paint(Graphics g){ this.creatWindow(g); /*打印string目录下的db.png图片,保持原图片大小,this.x+16表示相对数据库窗体左上角顶点x轴16个像素距离 this.y+16表示相对数据库窗体左上角顶点y轴16个像素距离*/ g.drawImage(IMG_DB,this.x+PADDING,this.y+PADDING, null); } }其他窗口上文字图片添加方法也跟上面一样。下面尝试为Panel添加一个背景图片package ui; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; public class LayBackground extends Lay { //TODO 临时背景 private static Image IMG_BG_TEMP=new ImageIcon("Graphics/background/bg01.jpg").getImage(); protected LayBackground(int x, int y, int w, int h) { super(x, y, w, h); // TODO Auto-generated constructor stub } @Override public void paint(Graphics g) { // TODO x,y没有加this就从Panel的左上角开始算,图片过小,调用drawImage的重载函数对图片进行拉伸为1162*654 g.drawImage(IMG_BG_TEMP,0,0,1162,654,null); } }![]()