2016-09-28 4 views
2

JavaFX의 TableView에 XML의 데이터를 채우려고합니다. 기본적으로 XML에서 데이터를 사용하여 tableview를 설정하려고 시도하는 XML &의 데이터를 구문 분석하고 있습니다. 그러나 코드에서 문제가 발생했습니다. 아래는 내 XML 파일의 형식입니다.JavaFX - XML의 데이터로 FXML TableView 채우기

XML 파일 아래

<?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 파서

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

데이터 소스 (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()에서 테이블 데이터를 설정하려고 할 때 첫 번째 인스턴스를 건너 뛰고 TableView의 XML 파일에서 환경 태그의 두 번째 인스턴스 값을 설정합니다. 아래 스크린 샷을 참조하십시오. enter image description here

다양한 시도를했지만 아무 효과가 없습니다. 누군가가 실수를 지적하거나 JavaFX TableView에 XML 값을 채우기위한 해결책을 제공 할 수 있습니까?

답변

1

당신은 그렇지 않으면 당신은 항상 ObservableList에 동일한 기준을 추가됩니다 for 루프 DataSource의 새로운 인스턴스를 작성해야합니다.

는이 작업을 수행 :

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을. 솔루션이 실제로 작동합니다. 변경 사항을 지적 해 주셔서 감사합니다. –