2016-09-28 3 views
2

Я пытаюсь заполнить TableView в JavaFX данными из XML. В принципе, я разбираю данные из XML &, пытаясь установить представление таблицы с данными из XML. Однако я столкнулся с проблемами в коде, который я придумал. Ниже представлен формат моего XML-файла.JavaFX - Заполнение FXView TableView с данными из XML

XML File

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Root> 
<xpression> 
<Environment> 
    <ProjectName>ABC</ProjectName> 
    <EnvironmentName>ABC Server</EnvironmentName> 
    <ServerURL>abcc.com:8080</ServerURL> 
    <SetDefault>Yes</SetDefault> 
</Environment> 
<Environment> 
    <ProjectName>XYZ</ProjectName> 
    <EnvironmentName>XYZ Server</EnvironmentName> 
    <ServerURL>xyz.com:8080</ServerURL> 
    <SetDefault>No</SetDefault> 
</Environment> 
</xpression> 
</Root> 

Ниже мой XML Синтаксический код:

XML Parser

public void parseXml() throws ParserConfigurationException, SAXException, IOException{ 
     DocumentBuilderFactory db = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = db.newDocumentBuilder(); 
     Document doc = dBuilder.parse(xmlFile); 
     doc.getDocumentElement().normalize(); 
     ObservableList<DataSource> data = FXCollections.observableArrayList(); 
     NodeList nList = doc.getElementsByTagName("Environment"); 
     DataSource ds = new DataSource(); 

     int j = 1; 
     for(int i = 0; i < nList.getLength(); i++){ 
      Node nNode = nList.item(i); 
      System.out.println("\nCurrent Element :" 
         + nNode.getNodeName()); 

      if (nNode.getNodeType() == Node.ELEMENT_NODE){ 
       Element element = (Element) nNode; 
       ds.setProjectName(element 
          .getElementsByTagName("ProjectName") 
          .item(0) 
          .getTextContent()); 
       System.out.println(element 
          .getElementsByTagName("ProjectName") 
          .item(0) 
          .getTextContent()); 

       ds.setEnvironment(element 
          .getElementsByTagName("EnvironmentName") 
          .item(0) 
          .getTextContent()); 
       System.out.println(element 
          .getElementsByTagName("EnvironmentName") 
          .item(0) 
          .getTextContent()); 

       ds.setServerURL(element 
          .getElementsByTagName("ServerURL") 
          .item(0) 
          .getTextContent()); 
       System.out.println(element 
          .getElementsByTagName("ServerURL") 
          .item(0) 
          .getTextContent()); 

       ds.setDefaultValue(element 
          .getElementsByTagName("SetDefault") 
          .item(0) 
          .getTextContent()); 
       System.out.println(element 
          .getElementsByTagName("SetDefault") 
          .item(0) 
          .getTextContent()); 

       ds.setSerialNo(j); 
       ++j; 
      } 
      //list.add(ds); 
      data.add(ds); 
     } 
     //data = FXCollections.observableArrayList(list); 
     tblDetails.setItems(data); 
    } 

DataSource (POJO) Файл:

public class DataSource { 
    public SimpleIntegerProperty serialNo = new SimpleIntegerProperty(); 
    public SimpleStringProperty projectName = new SimpleStringProperty(""); 
    public SimpleStringProperty environment = new SimpleStringProperty(""); 
    public SimpleStringProperty serverURL = new SimpleStringProperty(""); 
    public SimpleStringProperty defaultValue = new SimpleStringProperty(""); 

    public DataSource(){ 
     this(1,"","","",""); 
    } 

    public DataSource(int serial, String projectName,String envName, String serverURL, String defaultValue){ 
     setSerialNo(serial); 
     setEnvironment(envName); 
     setProjectName(projectName); 
     setServerURL(serverURL); 
     setDefaultValue(defaultValue); 
    } 

    public Integer getSerialNo(){ 
     return serialNo.get(); 
    } 

    public void setSerialNo(Integer serialNum){ 
     serialNo.set(serialNum); 
    } 

    public String getProjectName(){ 
     return projectName.get(); 
    } 

    public void setProjectName(String prjName){ 
     projectName.set(prjName); 
    } 

    public String getEnvironment(){ 
     return environment.get(); 
    } 

    public void setEnvironment(String envName){ 
     environment.set(envName); 
    } 

    public String getServerURL(){ 
     return serverURL.get(); 
    } 

    public void setServerURL(String serverUrl){ 
     serverURL.set(serverUrl); 
    } 

    public String getDefaultValue(){ 
     return defaultValue.get(); 
    } 

    public void setDefaultValue(String defaultInd){ 
     defaultValue.set(defaultInd); 
    } 
} 

В основном то, что происходит, когда я пытаюсь установить данные таблицы в свой parseXML(), он устанавливает значения 2-го экземпляра тега среды из XML-файла в TableView, пропуская первый экземпляр. См. Ниже снимок экрана: enter image description here

Я пробовал разные вещи, но ничего не работало. Может кто-то указать на ошибку или, возможно, дать решение для заполнения JavaFX TableView с XML-значениями?

ответ

1

Вам нужно создать новый экземпляр DataSource в вашем for цикла в противном случае вы будете всегда добавить ту же ссылку ваших ObservableList.

ли это:

for(int i = 0; i < nList.getLength(); i++){ 
    DataSource ds = new DataSource(); 

Вместо:

DataSource ds = new DataSource(); 
... 
for(int i = 0; i < nList.getLength(); i++){ 
+0

Большое спасибо @NicolasFilotto. Решение действительно работает. Спасибо, что указали на изменение. –

Смежные вопросы