JAVA读写XML配置文件
第一步:创建配置文件
在project下新建config目录,在此目录下新建xml文件,命名为cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<game>
<frame width ="1162" height = "654" padding="16" windowSize="7">
<layer className="ui.LayerBackground" x="0" y="0" w="0" h="0"/>
<layer className="ui.LayerDataBase" x="40" y="22" w="334" h="279"/>
<layer className="ui.LayerDisk" x="40" y="324" w="334" h="279"/>
<layer className="ui.LayerGame" x="414" y="22" w="334" h="581"/>
<layer className="ui.LayerButton" x="788" y="22" w="334" h="124"/>
<layer className="ui.LayerNext" x="788" y="178" w="176" h="148"/>
<layer className="ui.LayerLevel" x="964" y="178" w="158" h="148"/>
<layer className="ui.LayerPoint" x="788" y="358" w="334" h="200"/>
</frame>
<system>
</system>
<data>
</data>
</game>
第二步:创建配置读取器
在project/src下新建config包,并在包下新建GameConfig类、Layer Config类和Config Factory类,GameConfig类包含此项目的所有配置信息。包括游戏窗口的位置、大小以及各个layer层。LayerConfig类存放layer层的窗口信息,ConfigFactory类用来调用GameConfig类,ConfigFactory使用了static方法,在加载时就会创建一个GameConfig对象,且在整个项目过程中都只存在一个GameConfig对象,能减少内存占用。
GameConfig类
package config;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class GameConfig {
/**
* 窗口宽度
*/
private int width;
/**
* 窗口高度
*/
private int height;
/**
* 边框尺寸
*/
private int windowSize;
/**
* 边框内边距
*/
private int padding;
private ArrayList<LayerConfig> layersConfig = new ArrayList<LayerConfig>();
/**
* 构造函数,获取xml文件,获取全部游戏配置
* @throws Exception
*/
public GameConfig() throws Exception {
//创建XML读取器
SAXReader reader = new SAXReader();
//读取XML文件
Document doc = reader.read("config/cfg.xml");
//获取XML文件根节点
Element game = doc.getRootElement();
//配置窗口
this.setUiConfig(game.element("frame"));
//配置系统参数
this.setSystemConfig(game.element("system"));
//配置数据访问参数
this.setSystemData(game.element("data"));
}
/**
* 配置窗口
* @param frame
*/
private void setUiConfig(Element frame) {
this.width = Integer.parseInt(frame.attributeValue("width"));
this.height = Integer.parseInt(frame.attributeValue("height"));
this.windowSize = Integer.parseInt(frame.attributeValue("windowSize"));
this.padding = Integer.parseInt(frame.attributeValue("padding"));
List<Element> layers = frame.elements("layer");
for(Element layer : layers) {
LayerConfig lc = new LayerConfig(
layer.attributeValue("className"),
Integer.parseInt(layer.attributeValue("x")),
Integer.parseInt(layer.attributeValue("y")),
Integer.parseInt(layer.attributeValue("w")),
Integer.parseInt(layer.attributeValue("h"))
);
layersConfig.add(lc);
}
}
/**
* 配置系统信息
* @param frame
*/
private void setSystemConfig(Element frame) {
//TODO配置系统参数
}
/**
* 配置数据访问参数
* @param data
*/
private void setSystemData(Element data) {
//TODO 配置数据访问参数
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getWindowSize() {
return windowSize;
}
public int getPadding() {
return padding;
}
public List<LayerConfig> getLayersConfig() {
return layersConfig;
}
}
LayerConfig类
package config;
public class LayerConfig {
private String calssName;
private int x;
private int y;
private int w;
private int h;
public LayerConfig(String calssName, int x, int y, int w, int h) {
this.calssName = calssName;
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
public String getCalssName() {
return calssName;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getW() {
return w;
}
public int getH() {
return h;
}
}
Config Factory类
package config;
/**
* 定义static属性、方法
* 无论多少次使用到GameConfig都只需要加载一次,不需要创建多个GameConfig。可以提高程序运行效率
* @author Administrator
*
*/
public class ConfigFactory {
private static GameConfig GAME_CONFIG = null;
static {
try {
GAME_CONFIG = new GameConfig();
} catch (Exception e) {
e.printStackTrace();
}
}
public static GameConfig getGameConfig() {
return GAME_CONFIG;
}
}
第三步:使用配置信息
使用以下代码,可以创建配置信息中的各个窗口,并且使用paintComponent方法绘制窗口
//获取游戏配置
GameConfig cfg = ConfigFactory.getGameConfig();
//获取层配置
List<LayerConfig> layersCfg = cfg.getLayersConfig();
//创建层容器
layers = new ArrayList<Layer>(layersCfg.size());
try {
for(LayerConfig layercfg : layersCfg) {
//获得类对象
Class<?> cls = Class.forName(layercfg.getCalssName());
//获得构造器
Constructor<?> ctr = cls.getConstructor(int.class, int.class, int.class,int.class);
//调用构造器创建对象
Layer l = (Layer)ctr.newInstance(
layercfg.getX(),
layercfg.getY(),
layercfg.getW(),
layercfg.getH()
);
//把创建的layer对象放入到容器中
layers.add(l);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public void paintComponent(Graphics g) {
for(int i = 0;i < layers.size(); i++) {
layers.get(i).paint(g);
}
}
package ui;
import java.awt.Graphics;
import java.awt.Image;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import config.ConfigFactory;
import config.GameConfig;
import config.LayerConfig;
import util.Constant;
public class JPanelGame extends JPanel{
private List<Layer> layers = null;
public JPanelGame() {
//获取游戏配置
GameConfig cfg = ConfigFactory.getGameConfig();
//获取层配置
List<LayerConfig> layersCfg = cfg.getLayersConfig();
//创建层容器
layers = new ArrayList<Layer>(layersCfg.size());
try {
for(LayerConfig layercfg : layersCfg) {
//获得类对象
Class<?> cls = Class.forName(layercfg.getCalssName());
//获得构造器
Constructor<?> ctr = cls.getConstructor(int.class, int.class, int.class,int.class);
//调用构造器创建对象
Layer l = (Layer)ctr.newInstance(
layercfg.getX(),
layercfg.getY(),
layercfg.getW(),
layercfg.getH()
);
//把创建的layer对象放入到容器中
layers.add(l);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//@Override
public void paintComponent(Graphics g) {
for(int i = 0;i < layers.size(); i++) {
layers.get(i).paint(g);
}
}
}
package ui;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import util.Constant;
public class JFrameGame extends JFrame{
public JFrameGame() {
this.setTitle("Java俄罗斯方块");
//设置默认关闭属性,否则点击方框的叉号时窗口关闭但是程序未结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小
this.setSize(Constant.WINDOW_W,Constant.WINDOW_H);
//设置用户不可改变窗口大小
this.setResizable(false);
//创建一个工具类,获取显示屏的size
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screen = toolkit.getScreenSize();
int x = (screen.width - this.getWidth())/2;
int y = (screen.height - this.getHeight())/2 - 20;
this.setLocation(x,y);
//设置默认Panel
this.setContentPane(new JPanelGame());
}
}
package ui;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
public abstract class Layer {
protected static final int PADDING = 16;
private static final int SIZE = 7;
private static 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.getHeight(null);
/*
* 窗口左上角x坐标
*/
protected int x;
/*
* 窗口左上角y坐标
*/
protected int y;
/*
* 窗口宽度
*/
protected int w;
/*
* 窗口高度
*/
protected int h;
// public Lay() {
//
// }
protected Layer(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) {
//顺时针画窗口 左上 -> 上 -> 右上 -> 右 -> 右下 -> 下 -> 左下 -> 左
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 + w - SIZE, y + SIZE, x + w, y + h - SIZE, WINDOW_W - SIZE, SIZE, WINDOW_W, WINDOW_H - SIZE, 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);
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, y + h - SIZE, x + SIZE, y + h, 0, WINDOW_H - SIZE, SIZE, WINDOW_H, 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);
}
/**
* 刷新游戏窗口
* @param g
*/
protected abstract void paint(Graphics g) ;
}
package ui;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import util.Constant;
public class LayerBackground extends Layer {
private static Image BG_IMG = new ImageIcon("graphics/background/bg11.jpg").getImage();
public LayerBackground(int x, int y, int w, int h) {
super(x, y, w, h);
// TODO Auto-generated constructor stub
}
@Override
protected void paint(Graphics g) {
// TODO Auto-generated method stub
g.drawImage(BG_IMG, 0, 0,Constant.WINDOW_W+4,Constant.WINDOW_H, null);
}
}