0

XML ファイルから収集したデータを使用しています。を返すというXMLReaderメソッドを使用して、XML データ形式を読み取ることができると思われる というクラスを作成しました。readFromFileArrayList<HashMap<String, String>>

というクラスも作成し、コンストラクターから のextends AbstractTableModelインスタンスを作成しXMLReaderてメソッドを呼び出しますreadFromFile。ポイントは、Implemented する必要があるとわかっているものはすべて実装し、オーバーライドする必要があるものはすべてオーバーライドしましたが、それでもJTable XML ファイルからデータを表示することはできません。以下は、それぞれ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();
}

tblDataXML データとは関係ありません。あなたが持っている必要があります(fileDatanullでないことを確認してください):

@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 に答える