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);
		

	}

}