Question

I am working with data collected from an XML file. I created a class called XMLReader which is suppose to be able to read my XML data format using a method called readFromFile which returns an ArrayList<HashMap<String, String>>.

I Also created a class that extends AbstractTableModel, and I create an instance of XMLReader from the constructor and call the readFromFile method. The point is I implemented everything I know that needs to be Implemented and overrode everything that needs overriding, but still I still can't get my JTable to display the data from the XML file. Bellow is the XMLReader class and the class that extends AbstractTableModel respectively.

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

Here is the AbstractTableModel class

    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];
}

}

Funny things happen, the table displays the information when I put the line of code bellow, it was only meant for testing, but when I placed it in the constructor of TableModel it displayed all my values, but when I remove it the table refuses to display

for(int i=0; i<fileData.size(); i++){
        tblData.add(new TableData(1, "", "", "", "", "", ""));
    }

I have been working on this for the past ten hours now without a solution or explanation to why all the funny things happen. I would appreciate all help. Thanks

Was it helpful?

Solution

Here lies the cause of your problem:

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

tblData has nothing to do with your XML data. You should have (make sure fileData is not null):

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

By putting the code:

for(int i=0; i<fileData.size(); i++){
    tblData.add(new TableData(1, "", "", "", "", "", ""));
}

you only make tblData and fileData sizes equal. Thus, getRowCount method returns a valid value.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top