dom4j解析xml文件做为JTable的数据模型

本例展现一个Swing JTable的示例,其中表格中的数据模型来自xml文件,当表格中的数据被编缉过后,可以通过save按钮将数据保存到xml文件当中。对xml文件的解析使用了dom4j的解析方式,因此为确保您的编译通过,需要将dom4j.x.x.x.jar加入到classpath中,本例中,使用的dom4j版本为1.6.1。

要读取的xml文件(p.xml)内容如下:
<table name="person">
	<columns>
		<column name="name" type="java.lang.String"></column>
		<column name="gander" type="java.lang.String"></column>
		<column name="age" type="java.lang.Integer"></column>
		<column name="batcher" type="java.lang.Boolean"></column>
	</columns>
	<tr>
		<td>lijm</td>
		<td>male</td>
		<td>25</td>
		<td>true</td>
	</tr>
	<tr>
		<td>guyy</td>
		<td>female</td>
		<td>22</td>
		<td>true</td>
	</tr>
</table>


模型提供类,主要包括两个功能:
1,解析xml文件并封装为一个TableModel
2,将TableModel保存到xml文件中

package component.table;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * JTable模型提供者,它从xml文件中读取列的定义与行数据,封装到一个XmlTableModel对象中
 * 
 * @see XmlTableModel
 * @author Administrator
 * 
 */
public class TableModelProvider {

	/**
	 * 解析指定的xml文件,生成表格数据模型
	 * 
	 * @param name
	 *            xml文件路径名称
	 * @return XmlTableModel
	 */
	public XmlTableModel getModel(String name) {
		Document doc = getDocument(name);
		List<Column> columns = getComumns(doc);
		Vector<Object[]> vector = getRows(doc, columns);
		Object[] names = columns.toArray(new Column[columns.size()]);
		return new XmlTableModel(names, vector);

	}

	/**
	 * 解析指定的xml文件,返回其文档对象
	 * 
	 * @param file
	 * @return
	 */
	public Document getDocument(String file) {
		SAXReader reader = new SAXReader();
		Document document = null;
		try {
			document = reader.read(new File(file));
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		return document;
	}

	/**
	 * 保存xml Dom到指定的文件当中
	 * 
	 * @param doc
	 * @param name
	 */
	public void saveDocument(Document doc, String name) {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		try {
			XMLWriter writer = new XMLWriter(format);
			FileOutputStream fos = new FileOutputStream(name);
			writer.setOutputStream(fos);
			writer.write(doc);
			fos.close();
		} catch (UnsupportedEncodingException e) {

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析xml Dom中的列
	 * 
	 * @param doc
	 * @return
	 */
	private List<Column> getComumns(Document doc) {
		ArrayList<Column> list = new ArrayList<Column>();
		Element root = doc.getRootElement();
		Iterator<Element> el = root.element("columns")
				.elementIterator("column");
		while (el.hasNext()) {
			Element e = (Element) el.next();
			Column c = new Column(e.attributeValue("name"), e
					.attributeValue("type"));
			list.add(c);
		}
		return list;
	}

	/**
	 * 解析xml Dom中的行
	 * 
	 * @param doc
	 * @param columns
	 * @return
	 */
	private Vector<Object[]> getRows(Document doc, List<Column> columns) {
		Vector<Object[]> vector = new Vector<Object[]>();
		Element root = doc.getRootElement();
		List<Node> trList = root.elements("tr");
		for (int i = 0; i < trList.size(); i++) {
			Element tr = (Element) trList.get(i);
			List<Object> list2 = new ArrayList<Object>();
			List<Node> tdList = tr.elements("td");
			for (int j = 0; j < tdList.size(); j++) {
				Element td = (Element) tdList.get(j);
				list2
						.add(getTDValue(columns.get(j).getType(), td
								.getTextTrim()));
			}
			vector.add(list2.toArray(new Object[list2.size()]));
		}
		return vector;
	}

	/**
	 * 根据列定义的类型,对单元格中的数据进行类型转换
	 * 
	 * @param type
	 * @param value
	 * @return
	 */
	private Object getTDValue(String type, String value) {
		if ("java.lang.Integer".equals(type)) {
			return Integer.parseInt(value);
		}
		if ("java.lang.Boolean".equals(type)) {
			return Boolean.parseBoolean(value);
		}
		return value;
	}

	/**
	 * 将表格的数据模型保存到xml文件当中
	 * 
	 * @param model
	 * @param file
	 */
	public void saveModel(TableModel model, String file) {
		Document doc = DocumentHelper.createDocument();
		Element root = DocumentHelper.createElement("table");
		doc.setRootElement(root);
		Element columns = DocumentHelper.createElement("columns");
		for (int i = 0; i < model.getColumnCount(); i++) {
			Element column = DocumentHelper.createElement("column");
			column.addAttribute("name", model.getColumnName(i));
			column.addAttribute("type", model.getColumnClass(i).getName());
			columns.add(column);
		}
		root.add(columns);
		for (int i = 0; i < model.getRowCount(); i++) {
			Element tr = DocumentHelper.createElement("tr");
			for (int j = 0; j < model.getColumnCount(); j++) {
				Element td = DocumentHelper.createElement("td");
				td.setText(model.getValueAt(i, j).toString());
				tr.add(td);
			}
			root.add(tr);
		}
		saveDocument(doc, file);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TableModelProvider provider = new TableModelProvider();
		System.out.println(provider.getModel("p.xml"));
	}

}

/**
 * 表格列信息实体Bean
 * 
 * @author Administrator
 * 
 */
class Column {

	String name;
	String type;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Column(String name, String type) {
		this.name = name;
		this.type = type;
	}

	@Override
	public String toString() {
		return name;
	}
}

/**
 * 自定义的表格模型
 * @author Administrator
 *
 */
class XmlTableModel extends AbstractTableModel {

	private Object[] names;
	private Vector<Object[]> rows;

	public XmlTableModel(Object[] names, Vector<Object[]> rows) {
		this.rows = rows;
		this.names = names;
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return names.length;
	}

	@Override
	public int getRowCount() {
		return rows.size();
	}

	@Override
	public Object getValueAt(int row, int col) {
		return rows.get(row)[col];
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return getValueAt(0, columnIndex).getClass();
	}

	@Override
	public String getColumnName(int column) {
		return names[column].toString();
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		if (columnIndex >= 0 && columnIndex <= getColumnCount()) {
			return true;
		} else {
			return false;
		}
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		rows.get(rowIndex)[columnIndex] = aValue;
	}
}


下面的代码演示运行效果
package component.table;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MyTableTest extends JFrame {

	public MyTableTest() {

		final TableModelProvider provider = new TableModelProvider();
		final JTable t = new JTable();
		t.setModel(provider.getModel("p.xml"));

		JScrollPane pane = new JScrollPane(t);
		// t.setAutoResizeMode(JTable.)
		pane.getViewport().setSize(new Dimension(t.getWidth(), t.getHeight()));
		this.getContentPane().add(BorderLayout.CENTER, pane);

		JButton btn = new JButton("Save");
		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				provider.saveModel(t.getModel(), "p2.xml");
				JOptionPane.showMessageDialog(null, "已将表格中的数据保存到p2.xml中");
			}
		});
		this.getContentPane().add(BorderLayout.SOUTH, btn);

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setVisible(true);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new MyTableTest();
	}

}


你可能感兴趣的:(java,xml,swing,dom4j,jtable)