首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表视图中不同字符串的JavaFX计数外观而不进行迭代?

表视图中不同字符串的JavaFX计数外观而不进行迭代?
EN

Stack Overflow用户
提问于 2017-01-18 15:01:33
回答 1查看 178关注 0票数 0

我希望在Tableview中计数不同的状态,并在标签中显示它。是否有一种方法可以实现此功能,而无需每次值更改时对整个列表进行迭代?有办法将不同状态的数量绑定到标签上吗?

目前,我正在对列表进行迭代:

代码语言:javascript
复制
private void updateLbl(){
    int on = 0, off = 0, un = 0;
    for(StringContainer wps : streamLinkList){
        if(wps.getState().equals("online")){
            on++;
        } else if(wps.getState().equals("offline")){
            off++;
        } else if(wps.getState().equals("unknown")){
            un++;
        } else {
            se++;
        }
    }
    onLbl.setText("Online: " + on);    
    offLbl.setText("Offline: " + off);
    unLbl.setText("Unknown: " + un);

}

编辑:

这个列表是一个ObservableList。StringContainer包含不同的StringPropertys。

代码语言:javascript
复制
class StringContainer{
   private StringProperty state;

   public StringContainer(){
        this.state = new SimpleStringProperty();
   }
// state
public void setState(String state){
    this.state.set(state);
}

public String getState(){
    return state.get();
}

public StringProperty stateProperty(){
    return state;
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 18:47:03

您可以按照以下思路做一些事情:

代码语言:javascript
复制
ObservableList<StringContainer> items = table.getItems();

// initialize counts (only needed once, and only if items is non-empty):
int on = off = unk = 0 ;
for (StringContainer item : items) {
    if ("online".equals(item.getState())) on++ ;
    if ("offline".equals(item.getState())) off++ ;
    if ("unknown".equals(item.getState())) unk++ ;
}

IntegerProperty onCount = new SimpleIntegerProperty(on);
IntegerProperty offCount = new SimpleIntegerProperty(off);
IntegerProperty unknownCount = new SimpleIntegerProperty(unk);

onLbl.textProperty().bind(onCount.asString("Online: %s"));
offLbl.textProperty().bind(offCount.asString("Offline: %s"));
unLbl.textProperty().bind(unknownCount.asString("Unknown: %s"));

ChangeListener<String> listener = (obs, oldValue, newValue) -> {
    if ("online".equals(oldValue)) onCount.set(onCount.get() - 1);
    if ("offline".equals(oldValue)) offCount.set(offCount.get() - 1);
    if ("unknown".equals(oldValue)) unknownCount.set(unknownCount.get() - 1);
    if ("online".equals(newValue)) onCount.set(onCount.get() + 1);
    if ("offline".equals(newValue)) offCount.set(offCount.get() + 1);
    if ("unknown".equals(newValue)) unknownCount.set(unknownCount.get() + 1);
};

items.forEach(item -> item.stateProperty().addListener(listener));

items.addListener((ListChangeListener.Change<? extends StringContainer> c) -> {
    while (c.next()) {
        if (c.wasAdded()) {
            for (StringContainer item : c.getAddedSubList()) {
                item.stateProperty().addListener(listener);
                if ("online".equals(item.getState())) onCount.set(onCount.get() + 1) ;
                if ("offline".equals(item.getState())) offCount.set(offCount.get() + 1)  ;
                if ("unknown".equals(item.getState())) unknownCount.set(unknownCount.get() + 1)  ;

            }
        }
        if (c.wasRemoved()) {
            for (StringContainer item : c.getRemoved()) {
                item.stateProperty().removeListener(listener);
                if ("online".equals(item.getState())) onCount.set(onCount.get() - 1) ;
                if ("offline".equals(item.getState())) offCount.set(offCount.get() - 1)  ;
                if ("unknown".equals(item.getState())) unknownCount.set(unknownCount.get() - 1)  ;

            }
        }
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41722681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档