本例展现一个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();
}
}