JavaFX - 使用来自 XML 的数据填充 FXML TableView

标签 java xml javafx

我正在尝试使用来自 XML 的数据填充 JavaFX 中的 TableView。基本上,我正在解析来自 XML 的数据并尝试使用来自 XML 的数据设置 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() 中设置表数据时,它正在设置 TableView 中 XML 文件中环境标记的第二个实例的值,跳过第一个实例。请参阅以下屏幕截图: enter image description here

我尝试了各种方法,但没有任何效果。有人可以指出错误或可能提供用 XML 值填充 JavaFX TableView 的解决方案吗??

最佳答案

您需要在 for 循环中创建一个新的 DataSource 实例,否则您将始终添加相同的引用 到您的 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++){

关于JavaFX - 使用来自 XML 的数据填充 FXML TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39752147/

相关文章:

java - Java 中带有拨号动词的 TwiMLResponse

java - 使用Web服务开发带有服务器的Android应用程序

python - ElementTree - findall 递归选择所有子元素

java - 单击按钮时无法打开 fragment

javascript - Javascript 可以告诉 JavaFX 产生一个线程并在完成时得到通知吗?

java - 如何从命令行运行 JavaFx 应用程序

java - 为什么 Palantir QS 3.8 无法识别其自己的 XML 导出?

java - 如何在 Hibernate 中干净地映射 2 个一对一关联

xml - XSL - 为什么会永远递归?

java - 为什么我的 JavaFX TableView 是空的