2016-09-28 17 views
2

XMLからのデータをJavaFXでTableViewに取り込みしようとしています。基本的には、私はXMLからのデータでtableviewを設定しようとしているXML &からデータを解析しています。 しかし、私は、私が思いついたコードの問題に直面しています。以下は私のXMLファイルのフォーマットです。JavaFX - FXML TableViewにXMLのデータを取り込みます。

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()でテーブルデータを設定しようとすると、最初のインスタンスをスキップして、XMLファイルから環境タグの2番目のインスタンスの値をTableViewに設定しています。以下のスクリーンショットをご覧ください: enter image description here

私はいろいろ試しましたが、何も効果がありませんでした。誰かが間違いを指摘できますか、おそらくJavaFX TableViewにXML値を入力するためのソリューションを提供できますか?

あなたの forループで DataSourceの新しいインスタンスを作成する必要が

答えて

1

そうでない場合、あなたは常にあなたのObservableListに同じ参照を追加します。

この操作を行います。おかげでたくさんの@NicolasFilotto

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

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

の代わりに。このソリューションは本当に機能します。変更を指摘してくれてありがとう。 –

関連する問題