TreeItem在父/子下设置多个子项

时间:2018-04-20 02:06:24

标签: javafx

我正在尝试获取要在一个数据结构下显示的设备ID列表,而不是每个ID旁边带有设备名称的列表。

我试图让它显示出来:

  • 现场设备
    • 入口P1
      • M&安培; C-SP2500
        • 329
      • 生病的Maihak-MCS 100e
        • 330
        • 336
        • 538
    • 入口P2
  • 等...

数据来自MySQL查询并使用ObservableList。

private ObservableList<Customer_EquipTree> equiptrees;

    TreeItem<String> rootItem = new TreeItem<String>("Site Equipment");
    rootItem.setExpanded(true);
        for (Customer_EquipTree equiptree : equiptrees) {
            TreeItem<String> equip = new TreeItem<String>(equiptree.getEquipment());
            TreeItem<String> clID = new TreeItem<String>(equiptree.getclID().toString());
            boolean found = false;

            for (TreeItem<String> siteDes : rootItem.getChildren()) {
                if (siteDes.getValue().contentEquals(equiptree.getSiteDesignation())) {                             
                    siteDes.getChildren().add(equip);
                    equip.getChildren().add(clID);                              
                    found = true;
                    break;
                }                           
            }
            if (!found) {
                TreeItem<String> siteDes = new TreeItem<String>(equiptree.getSiteDesignation());
                rootItem.getChildren().add(siteDes);
                siteDes.getChildren().add(equip);
                equip.getChildren().add(clID);
                locationTreeView.setRoot(rootItem);
            }                       
    }

这就是我的方式         公共类Customer_EquipTree {

private String SiteDesignation;
private String Equipment;
private Integer Checklistid;
private Integer clID;

public Customer_EquipTree(String SiteDesignation, String Equipment, Integer Checklistid, Integer clID)  {
    this.SiteDesignation = SiteDesignation;
    this.Equipment = Equipment;
    this.Checklistid = Checklistid;
    this.clID = clID;
}

public String getSiteDesignation()  {
    return SiteDesignation;
}

public void setSiteDesignation(String SiteDesignation)  {
    this.SiteDesignation = SiteDesignation;
}

public String getEquipment()    {
    return Equipment;
}

public void setEquipment(String Equipment)  {
    this.Equipment = Equipment;
}

public Integer getChecklistid() {
    return Checklistid;
}

public void setChecklistid(Integer Checklistid) {
    this.Checklistid = Checklistid;
}

public Integer getclID() {
    return clID;
}

public void setclID(Integer clID) {
    this.clID = clID;
}

@Override
public String toString()    {
    return SiteDesignation + " " + Equipment.toString();
}

}

1 个答案:

答案 0 :(得分:0)

在我看来,你的Customer_EquipTree基本上是网站,设备和id的元组,每个id都有一个。看起来您需要以与查找现有站点相同的方式查找现有设备。

您应该为此创建一个帮助方法,以避免代码重复:

public static <T> TreeItem<T> findOrInsert(TreeItem<T> parent, T childValue) {
    for (TreeItem<T> child : parent.getChildren()) {
        if (child.getValue().equals(childValue)) {
            return child;
        }
    }
    TreeItem<T> result = new TreeItem<T>(childValue);
    parent.getChildren().add(result);
    return result;
}
for (Customer_EquipTree equiptree : equiptrees) {
    TreeItem<String> siteDes = findOrInsert(rootItem, equiptree.getSiteDesignation());
    TreeItem<String> equip = findOrInsert(siteDes, equiptree.getEquipment());
    equip.getChildren().add(new TreeItem<>(equiptree.getclID().toString()));
}

顺便说一下:在你的sql查询中使用ORDER BY可以让你稍微简化树的创建,因为你可以确保{{1}中具有匹配的站点/设备值的项目彼此相邻},例如

ResultSet