JavaFX 手风琴设置下一个展开的窗格
JavaFX Accordion set next expanded Pane
在 Accordion 中,可以使用 accordion.setExpandedPane
设置选定的 Pane,也可以使用 accordion.getPanes()
获取所有子级。
然而,我正在努力寻找如何实现 "select next Pane" 功能,而无需为窗格显式扩展 TitledPane class,并通过 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;
}
});
有更简单的方法吗?
您可以使用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()
returns null
.
的情况
在 Accordion 中,可以使用 accordion.setExpandedPane
设置选定的 Pane,也可以使用 accordion.getPanes()
获取所有子级。
然而,我正在努力寻找如何实现 "select next Pane" 功能,而无需为窗格显式扩展 TitledPane class,并通过 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;
}
});
有更简单的方法吗?
您可以使用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()
returns null
.