我正在尝试使用来自 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 文件中环境标记的第二个实例的值,跳过第一个实例。请参阅以下屏幕截图:
我尝试了各种方法,但没有任何效果。有人可以指出错误或可能提供用 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/