由于上述方法并不适合所有人(包括我),因此我对其进行了更多调查,并找到了问题的根源。
一般而言,这两种方法都可以使用,但是只有在设置了
ScrollPane的
skin属性后才能使用。就我而言,
skin仍然是
null在使用加载视图后仍然存在
FXMLLoader。
通过在
skin属性未初始化的情况下延迟调用(使用单次侦听器)可以解决此问题。
工作样板代码:
ScrollPane scrollPane;// ...if (scrollPane.getSkin() == null) { // Skin is not yet attached, wait until skin is attached to access the scroll bars ChangeListener<Skin<?>> skinChangeListener = new ChangeListener<Skin<?>>() { @Override public void changed(Observablevalue<? extends Skin<?>> observable, Skin<?> oldValue, Skin<?> newValue) { scrollPane.skinProperty().removeListener(this); accessScrollBar(scrollPane); } }; scrollPane.skinProperty().addListener(skinChangeListener);} else { // Skin is already attached, just access the scroll bars accessScrollBar(scrollPane);}private void accessScrollBar(ScrollPane scrollPane) { for (Node node : scrollPane.lookupAll(".scroll-bar")) { if (node instanceof ScrollBar) { ScrollBar scrollBar = (ScrollBar) node; if (scrollBar.getOrientation() == Orientation.HORIZONTAL) { // Do something with the horizontal scroll bar // Example 1: Print scrollbar height // System.out.println(scrollBar.heightProperty().get()); // Example 2: Listen to visibility changes // scrollBar.visibleProperty().addListener((observable, oldValue, newValue) -> { // if(newValue) { // // Do something when scrollbar gets visible // } else { // // Do something when scrollbar gets hidden // } // }); } if (scrollBar.getOrientation() == Orientation.VERTICAL) { // Do something with the vertical scroll bar } } }}


