0

我正在处理从 XML 文件收集的数据。我创建了一个名为的类XMLReader,假设它能够使用一种名为的方法读取我的 XML 数据格式,该方法readFromFile返回一个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没有解决或解释为什么会发生所有有趣的事情。我将不胜感激所有帮助。谢谢

4

1 回答 1

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, "", "", "", "", "", ""));
}

你只做tblDatafileData大小相等。因此,getRowCount方法返回一个有效值。

于 2013-07-27T23:12:59.403 回答