在Accordion中,可以用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;
        }
    });


有没有更简单的方法呢?

最佳答案

您可以使用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的情况。

关于java - JavaFX Accordion 将进一步扩展面板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56816589/

10-13 04:53