在手风琴中,可以用accordion.setExpandedPane
设置选定的窗格,也可以用accordion.getPanes()
来获得所有子级。
但是,我一直在努力寻找如何实现“选择下一个窗格”功能而不显式扩展窗格的TitledPane类,以及如何通过accordion.expandedPaneProperty()
和一些自定义实现手动维护索引的方法。
一个建议的解决方案是添加一个已收听的expandedPaneProperty()
:
accordion.expandedPaneProperty().addListener((observable, oldValue, newValue) -> {
if(null != newValue){
idx = 0;
for(TitledPane whytho: this.getPanes()){
if(!whytho.equals(newValue))idx++;
else break;
}
selectedIndex = idx;
}
});
有没有更简单的方法?
答案 0 :(得分:2)
您可以使用List#indexOf(Object)
查询当前展开的窗格的索引。然后,您只需要将展开的窗格设置为index ± 1
上的窗格即可。
private void expandPrevious(Accordion acc) {
int index = acc.getPanes().indexOf(acc.getExpandedPane());
int newIndex = Math.max(index - 1, 0);
acc.setExpandedPane(acc.getPanes().get(newIndex));
}
private void expandNext(Accordion acc) {
int index = acc.getPanes().indexOf(acc.getExpandedPane());
int newIndex = Math.min(index + 1, acc.getPanes().size() - 1);
acc.setExpandedPane(acc.getPanes().get(newIndex));
}
上面没有执行任何环绕逻辑;换句话说,在扩展最后一个窗格时调用expandNext
不会扩展第一个窗格,而是什么也不会改变。它也无法处理getExpandedPane()
返回null
的情况。