我正在使用从XML文件收集的数据。我创建了一个名为XMLReader
的类,它假设能够使用名为readFromFile
的方法读取我的XML数据格式,该方法返回ArrayList<HashMap<String, String>>
。
我还创建了一个extends
AbstractTableModel
的类,我从构造函数创建了一个XMLReader
实例,并调用readFromFile
方法。关键是我实现了我所知道的所有需要实现的内容并覆盖了需要覆盖的所有内容,但仍然无法让我的JTable
显示XML文件中的数据。 Bellow是XMLReader
类,而extends
AbstractTableModel
分别为。
package meetingmanager;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLReader {
private static final String filePath = "XMLData.xml";
public String sN;
public String firstName;
public String surName;
public String visitTime;
public String scheduledTime;
public String whomToVisit;
public String reasonForVisit;
public String status;
public XMLReader()
{
}
public ArrayList<HashMap<String, String>> readFromFile()
{
try{
File xmlFile = new File(filePath);
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = docFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Visitor");
ArrayList<HashMap<String, String>> tblData = new ArrayList<>();
for(int i = 0; i<nList.getLength(); i++)
{
Node nNode = nList.item(i);
NamedNodeMap attr = nNode.getAttributes();
Node nodeAttr = attr.getNamedItem("id");
String[] rowValues = new String[8];
HashMap<String, String> mp = new HashMap<>();
sN = nodeAttr.getTextContent();
if(nNode.getNodeType() == Node.ELEMENT_NODE)
{
NodeList valueList = nNode.getChildNodes();
for(int j=0; j<valueList.getLength(); j++)
{
rowValues[0] = sN;
Node eachValue = valueList.item(j);
String nodeName = eachValue.getNodeName();
String value = eachValue.getTextContent();
mp.put("sN", sN);
int count = j+1;
switch(nodeName)
{
case "FirstName":
firstName = value;
rowValues[count] = value;
mp.put("FirstName", value);
break;
case "SurName":
surName = value;
rowValues[count] = value;
mp.put("SurName", value);
break;
case "VisitTime":
visitTime = value;
rowValues[count] = value;
break;
case "ScheduledTime":
scheduledTime = value;
rowValues[count] = value;
mp.put("ScheduledTime", value);
break;
case "WhomToVisit":
whomToVisit = value;
rowValues[count] = value;
mp.put("WhomToVisit", value);
break;
case "ReasonForVisit":
reasonForVisit = value;
mp.put("ReasonForVisit", value);
rowValues[count] = value;
break;
case "Status":
status = value;
rowValues[count] = value;
mp.put("Status", value);
break;
}
}
// tblData.add(rowValues);
tblData.add(mp);
}
}
return tblData;
//System.out.println(tblData.get(1000)[0]);
}catch(ParserConfigurationException | SAXException | IOException | DOMException ex)
{
}
return null;
}
这是AbstractTableModel
类
package meetingmanager;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableModel extends AbstractTableModel implements TableModelListener{
ArrayList<TableData> tblData = new ArrayList<TableData>();
ArrayList<FileContent> tblData2 = new ArrayList<FileContent>();
String[] columnName = {"S/N", "VisitorName", "Date of Visit", "Scheduled Date", "Whom to see", "Reason of visit", "status of Visit"};
ArrayList<HashMap<String, String>> fileData;
@SuppressWarnings("unchecked")
public TableModel()
{
fileData = new XMLReader().readFromFile();
}
@Override
public void tableChanged(TableModelEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int getRowCount() {
return tblData.size();
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex){
case 0:
return fileData.get(rowIndex).get("sN");
case 1:
return fileData.get(rowIndex).get("FirstName")+ " "+ fileData.get(rowIndex).get("SurName");
case 2:
return fileData.get(rowIndex).get("VisitTime");
case 3:
return fileData.get(rowIndex).get("ScheduledTime");
case 4:
return fileData.get(rowIndex).get("WhomToVisit");
case 5:
return fileData.get(rowIndex).get("ReasonForVisit");
case 6:
return fileData.get(rowIndex).get("Status");
default:
return "";
}
}
@Override
public String getColumnName(int col)
{
return columnName[col];
}
}
有趣的事情发生了,当我把代码行放在下面时,表格会显示信息,它仅用于测试,但当我将它放在TableModel
的构造函数中时,它显示了我的所有值,但是当我删除它,表拒绝显示
for(int i=0; i<fileData.size(); i++){
tblData.add(new TableData(1, "", "", "", "", "", ""));
}
我过去ten hours
一直在研究这个问题而没有解决方案或解释为什么所有有趣的事情都会发生。我将非常感谢所有的帮助。感谢
答案 0 :(得分:3)
这就是问题的原因:
@Override
public int getRowCount() {
return tblData.size();
}
tblData
与您的XML数据无关。你应该(确保fileData
不为空):
@Override
public int getRowCount() {
return fileData.size();
}
通过输入代码:
for(int i=0; i<fileData.size(); i++){
tblData.add(new TableData(1, "", "", "", "", "", ""));
}
您只能使tblData
和fileData
尺寸相等。因此,getRowCount
方法返回有效值。