JAVA读写XML配置文件

来源:互联网 发布:教育大数据平台 编辑:程序博客网 时间:2024/06/06 04:26

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 blocke.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 blocke.printStackTrace();}}//@Overridepublic 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);//创建一个工具类,获取显示屏的sizeToolkit 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);//设置默认Panelthis.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}@Overrideprotected void paint(Graphics g) {// TODO Auto-generated method stubg.drawImage(BG_IMG, 0, 0,Constant.WINDOW_W+4,Constant.WINDOW_H, null);}}




原创粉丝点击