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

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值