我正在尝试设置TabIds,每个标签都会从名为entityList的列表中获取其Id和Text。问题是选项卡的数量取决于此实体列表的大小+另外的第一个选项卡(用户输入entityList),我工作得很好,除了第一个选项卡应始终命名为“概述”。
我知道如何设置它,但我不知道如何跳过增强for循环中的第一个选项卡(以便它从第二个选项卡开始设置ID,它将包含entityList的第一个字符串)。以下是我的方法:
@FXML
public void currentTabIndex() {
ObservableList<Tab> tabID = mainTabPane.getTabs();
int i=0;
//tabID.get(0).setId("Overview"); --> can't figure out where this should be placed
//tabID.get(0).setText("Overview"); --> and this too
for (Tab loop:tabID) {
for(;i<tabID.size()-1;) {
loop.setId(entityList.get(i).getEntitytName());
loop.setText(entityList.get(i).getEntitytName());
i++;
break;
}
}
}
答案 0 :(得分:3)
使用增强的for循环,不可能跳过第一次迭代。通过引入支票可以解决这个问题,但我建议采用其他方法:
您可以使用迭代器
来使用传统的for循环for (Iterator<Tab> iterator = tabID.listIterator(1); iterator.hasNext();) {
Tab loop = iterator.next();
...
}
或迭代子列表:
for (Tab loop : tabID.subList(1, tabID.size())) {
...
}
答案 1 :(得分:2)
Stream为您的案例提供了一种方法,您可以在使用skip method之后从stream()
获取OvbservableList
:
tabID.stream().skip(1).forEach(loop->{
loop.setId(entityList.get(i).getEntitytName());
loop.setText(entityList.get(i).getEntitytName());
i++;
});
skip
参数:要跳过的主要元素数量从 1 开始。
编辑基于@Radiodef评论
出于某些原因,如果您发现需要增强的for
循环,则可以将代码转换为:
for (Tab loop : (Iterable<Tab>) tabID.stream().skip(1)::iterator) {
......
}
答案 2 :(得分:1)
一个简单的解决方案是添加一个变量来跟踪第一个索引是否已被处理,如果没有,则跳过循环的迭代。
要执行此操作,请更改此代码:
for (Tab loop:tabID) {
for(;i<tabID.size()-1;) {
loop.setId(entityList.get(i).getEntitytName());
loop.setText(entityList.get(i).getEntitytName());
i++;
break;
}
}
到此代码:
boolean skippedFirst = false;
for (Tab loop:tabID) {
if(!skippedFirst){
skippedFirst = true;
}else {
for(;i<tabID.size()-1;) {
loop.setId(entityList.get(i).getEntitytName());
loop.setText(entityList.get(i).getEntitytName());
i++;
break;
}
}
}